人在江湖~

做一个快乐学习的小透明~~~

导航

Python系列(2)——time时间格式的转换及计算

 1 # -*- coding:utf-8 -*-
 2 import pandas as pd
 3 import time
 4 import datetime
 5 
 6 start_date = '2020-06-08'
 7 # 一、将字符串文本类型转化为时间
 8 # %Y-%m-%d 为自定义时间格式,也可设置成完整格式:%Y-%m-%d %H:%M:%S,若使用完整格式,输入的start_date的文本格式也要完整对应,否则报错
 9 # 1.使用datetime包
10 date_time = datetime.datetime.strptime(start_date, '%Y-%m-%d')  # 转化后的时间是带有时分秒的
11 print(date_time)  # 2020-06-08 00:00:00
12 print(type(date_time))  # <class 'datetime.datetime'>
13 """
14 datetime模块中主要使用的是:
15 datetime.date:日期(2020-01-01)
16 datetime.time:时间(12:00:00)
17 datetime.datetime:时期(2020-01-01 12:00:00)
18 """
19 # 2.使用time包中的time.strptime
20 time_time = time.strptime(start_date, '%Y-%m-%d')  # 返回struct_time对象。
21 print(time_time)
22 print(type(time_time))  # <class 'time.struct_time'>
23 """
24 参数解释:time.struct_time(tm_year=年, tm_mon=月, tm_mday=日, tm_hour=时, tm_min=分, tm_sec=秒,
25 tm_wday=星期(0-6),星期一为0, tm_yday=一年中第几天, tm_isdst=-1是否是夏令时,1-夏令时,0-非夏令时 -1-不确定,默认是-1)
26 """
27 
28 # 3.直接使用pandas的to_datetime(文本)--主要用来处理组数据
29 pd_time = pd.to_datetime(start_date)  # 转化后的时间是带有时分秒的
30 print(pd_time)  # 2020-06-08 00:00:00
31 print(type(pd_time))  # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
32 
33 # 从上述时间类型中提取某个字段数据出来 ,其他字段类似.year/month/day/weekday()/isoweekday()返回的1-7代表周一--周日/。。。
34 print(date_time.month)
35 print(time_time.tm_yday)
36 print(pd_time.weekday())
37 # 若转化一列数据的时间类型使用:pd.to_time(文件['列名']) ,此时若提取其中数据字段:文件['列名'].dt.month/year...(ps:后面内容有涉及)

 1 # 例如:
 2 df = pd.read_excel('./北京天气2018.xls')  # 读取 北京天气2018.xls文件
 3 pd.to_datetime(df['日期'])  # 将日期这一列变成时间类型
 4 print(df['日期'].dt.month)  # 使用.dt提取日期属性
 5 
 6 
 7 # 二、将时间格式转为字符串
 8 # 1.使用str或 strftime
 9 print(str(pd_time))
10 print(type(str(pd_time)))
11 
12 str_time1 = date_time.strftime('%Y-%m-%d %H:%M:%S')
13 print(str_time1)  # 2020-06-08 00:00:00
14 print(type(str_time1))
15 
16 str_time2 = pd_time.strftime('%Y-%m-%d %H:%M')
17 print(str_time2)  # 2020-06-08 00:00
18 print(type(str_time2))
19 
20 # 2.time包时间格式的转换
21 str_time3 = time.strftime('%Y-%m-%d', time_time)
22 print(str_time3)  # 2020-06-08
23 print(type(str_time3))  # <class 'str'>
 1 # 三、时间的计算
 2 import pandas as pd
 3 import time
 4 import datetime
 5 
 6 # 1.简单的时间计算
 7 start_date = '2020-06-08 10:00:00'
 8 end_date = '2020-06-10 15:30:00'
 9 start_time = datetime.datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
10 end_time = datetime.datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')
11 during_time = end_time - start_time
12 # during_time = pd.to_datetime(end_date) - pd.to_datetime(start_date)
13 # 这里不适宜使用time.strptime时间化,因为time.struct_time无法进行计算
14 print(during_time)  # 2 days, 5:30:00
15 print(during_time.days)  # 2
16 print(during_time.seconds)  # 小时之间相差的秒数19800
17 print(during_time.total_seconds())  # 总共相差的秒数192600.0
18 
19 # 2.timedelta时间计算
20 # timedelta --datetime模块下的,主要是用于日期计算的,代表两个时间之间的时间差,两个date或datetime对象相减就可返回一个timedelta对象
21 # 在需要使用到时间间隔的时候非常有用,例如需要上一个月,前一天,上一周这样的日期,就可以使用datetime和timedelta很容易得到。
22 # datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
23 today = datetime.datetime.today()
24 # today = datetime.date.today()  只有年月日的日期
25 # 上个月最后一天
26 last_month_last_day = datetime.date(today.year, today.month, 1) - datetime.timedelta(1)
27 print(last_month_last_day)
28 # 上个月的第一天
29 print(datetime.date(last_month_last_day.year, last_month_last_day.month, 1))  # 2020-05-01
30 # 一周之前
31 print(today - datetime.timedelta(7))
32 print(today - datetime.timedelta(weeks=1))  # 等价
33 # 3小时30分钟之前--其他类似
34 print(today - datetime.timedelta(hours=3, minutes=30))
35 print(datetime.timedelta(hours=3, seconds=22).total_seconds())  # 3小时22秒的总秒数 10822.0
36 # 8小时30秒后
37 print(today + datetime.timedelta(hours=8, seconds=30))
38 # 本周一
39 this_monday = today - datetime.timedelta(today.isoweekday() - 1)  # .isoweekday()返回的1-7代表周一--周日
40 print(this_monday)
41 # 本周二 --其他类似
42 print(today - datetime.timedelta(today.isoweekday() - 2))
43 # 本周日
44 this_sunday = today - datetime.timedelta(today.isoweekday() - 7)
45 print(this_sunday)
46 # 上周一
47 print(this_monday-datetime.timedelta(weeks=1))
48 print(this_monday-datetime.timedelta(7))  # 等价
49 # 上周日
50 print(this_sunday-datetime.timedelta(weeks=1))
51 
52 # 3.pandas模块对时间的处理
53 # 有下面一数据
54 data = {'date': ['2020-05-29', '2020-05-30', '2020-05-31', '2020-06-01', '2020-06-02', '2020-06-03', '2020-06-04',
55                  '2020-06-05', '2020-06-06', '2020-06-07', '2020-06-08', '2020-06-09'],
56         'lower_temp': [17, 18, 22, 22, 23, 22, 22, 21, 21, 22, 22, 24],
57         'high_temp': [25, 19, 28, 30, 33, 28, 30, 23, 28, 29, 28, 29]
58         }
59 df = pd.DataFrame(data)

 1 # 3.1.根据原数据类型进行查询
 2 # 设定date为索引(即设置date列为行名),方便按日期筛选--date为字符串文本类型
 3 # 下面输入的'2020-06-01'等日期是字符串文本类型,因此索引的类型也要字符串文本类型,否则无法匹配寻找
 4 # date若为时间类型可先进行转换文本:df['date'] = df['date'].dt.strftime('%Y-%m-%d')
 5 df.set_index('date', inplace=True)
6 # (1)使用单个日期 7 print(df.loc['2020-06-01', :]) # :表示是所有列 8 print(df.loc['2020-06-01', 'high_temp']) 9 print(df.loc['2020-06-01', 'lower_temp':'high_temp']) # 'lower_temp'至'high_temp'列 10 # (2)使用多个日期 11 print(df.loc[['2020-06-01', '2020-06-05'], 'high_temp']) # 6-1,6-5的高温high_temp 12 print(df.loc['2020-06-01':'2020-06-05', 'high_temp']) # 6-1至6-5的高温high_temp 13 14 # 3.2.转化为时间类型进行查询 15 # (1)对date时间这一列转为时间格式 16 df['date'] = pd.to_datetime(df['date']) 17 # (2)筛选某个时间片段 18 print(df.loc[df['date'] == pd.to_datetime('2020-06-03')]) # 6.3的数据 19 print(df.loc[df['date'] >= pd.to_datetime('2020-06-03')]) # 6.3之后的数据 20 # 筛选满足多个条件的数据--条件之间用&连接 21 print(df.loc[(df['date'] >= pd.to_datetime('2020-06-03')) & (df['date'] <= pd.to_datetime('2020-06-05'))]) # 6.3-6.5数据 22 print(df.loc[(df['date'] >= pd.to_datetime('2020-06-01')) & (df['high_temp'] >= 30)]) 23 24 """ 25 # 若是设置date时间格式列为索引,上述代码要改写 26 df.set_index('date', inplace=True) 27 print(df.loc[pd.to_datetime('2020-06-03')]) 28 print(df.loc[:pd.to_datetime('2020-06-03'), :]) # 6.3之前的数据 29 print(df.loc[pd.to_datetime('2020-06-03'):, :]) # 6.3之后的数据 30 print(df.loc[pd.to_datetime('2020-06-03'):pd.to_datetime('2020-06-05'), :]) # 6.3-6.5数据 31 """ 32 # (3)判断某个日期是周几、出现的次数等等。。。 33 print(df['date'].dt.weekday) # 直接显示date这一列的星期数0-6周一-周日 34 print(df['date'].dt.is_month_start) # 判断是否是一个月的开始 35 print(df['date'].dt.is_month_end) # 判断是否是一个月的结束 36 print(df['date'].dt.is_leap_year) # 判断是否闰年 37 print(df['date'].dt.year.value_counts()) # 判断年出现的次数 38 print(df['date'].dt.month.value_counts()) # 判断月出现的次数 39 40 # (4对日期增减 41 import dateutil # 导入新库 42 # 增加1天(减少天用-号) 43 print(pd.to_datetime('2020-06-03')+dateutil.relativedelta.relativedelta(days=1)) # 2020-06-04 00:00:00 44 # 增加2年 45 print(pd.to_datetime('2020-06-03')+dateutil.relativedelta.relativedelta(years=2)) # 2022-06-03 00:00:00 46 # 对月/时/分/秒增加直接将变量名改为months/hours/minutes/seconds 即可 47 print(pd.to_datetime('2020-06-03')+dateutil.relativedelta.relativedelta(years=2, days=50, minutes=10)) # 2022-07-23 00:10:00 48 # 若将参数变成单数year/day/month/hour/minute/second 并不是日期的加减,而是将日期对应值变成所设置的参数值 49 print(pd.to_datetime('2020-06-03')+dateutil.relativedelta.relativedelta(year=1991, day=5, minute=10)) # 1991-06-05 00:10:00

 

 

 

posted on 2020-06-08 16:25  人在江湖~  阅读(4218)  评论(0编辑  收藏  举报