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