在进行matplotlib时间序列型图表之前,首先了解python内置库和pandas中常见的时间处理方法,本篇及之后几篇会介绍常见库的常用方法作为时间序列图表的基础。
1 python内置库的常见时间处理方法
在python中时间处理内置库为time和datetime。在使用时无需安装,直接调用即可。
python中日期格式化符号
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12) 如 11:19:55 AM %I:%M:%S %p
%M 分钟数(00-59)
%S 秒(00-59)
%a 本地简化星期名称 如Mon
%A 本地完整星期名称 如Monday
%b 本地简化的月份名称 如Jan
%B 本地完整的月份名称 如January
%c 本地相应的日期和时间表示
%j 年内的一天(001-366)
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
1.1 datetime库的常见时间方法
datetime库是注重处理日期和时间的类,常见的时间类型如下表所示:
类型 | 描述 |
---|---|
datetime.date | 理想化的简单型日期,属性:year、month、day |
datetime.time | 独立于任何特定日期的理想化时间,属性:hour、minute、second、microsecond |
datetime.datetime | 日期和时间的结合,属性:year、month、day、hour、minute、second、microsecond |
datetime.timedelta | 表示两个date对象、time对象或datetime对象之间的时间间隔,精确到毫秒 |
1.1.1 date对象
生成date对象方法:
1)通过字符串生成(两种)
代码语言:javascript复制#方法一,通过字符串转换函数生成date
o_date = datetime.datetime.strptime('2021/7/7', '%Y/%m/%d').date()
print(o_date, type(o_date), sep = 't')
#方法二,要求字符串必须为YYYY-MM-DD格式,是date.isoformat逆操作
o_date = datetime.date.fromisoformat('2022-07-07')
print(o_date, type(o_date), sep = 't')
输出结果:
代码语言:javascript复制2021-07-07 <class 'datetime.date'>
2022-07-07 <class 'datetime.date'>
2)通过datetime对象生成
代码语言:javascript复制#先生成datetime对象,再利用date方法
o_datetime = datetime.datetime.strptime('2021/7/7', '%Y/%m/%d')
print(o_datetime, type(o_date), sep = 't')
o_date = o_datetime.date()
print(o_date, type(o_date), sep = 't')
输出结果:
代码语言:javascript复制2021-07-07 00:00:00 <class 'datetime.date'>
2021-07-07 <class 'datetime.date'>
3)调用当地日期生成date对象
代码语言:javascript复制#4,返回当地日期,类似于date.fromtimesatmp(time.time())时间戳
o_date = datetime.date.today()
print(o_date, type(o_date), sep = 't')
输出结果:
代码语言:javascript复制2022-07-07 <class 'datetime.date'>
4)通过时间戳获取date对象
代码语言:javascript复制#提供参数时间戳,返回date对象,time.time()就是时间戳
import time
o_date = datetime.date.fromtimestamp(time.time())
print(o_date, type(o_date), sep = 't')
输出结果:
代码语言:javascript复制2022-07-07 <class 'datetime.date'>
5)通过年、星期、日生成date对象(python3.7新增)
代码语言:javascript复制#星期为0-52,是这一年的第几星期,日为1-7,为本周的第几天,1为星期一
#以下代码输出的就是2022年第52周的第2天(周二)
o_date = date.fromisocalendar(2022, 52, 2)
print(o_date, type(o_date), sep = 't')
输出结果:
代码语言:javascript复制2022-12-27 <class 'datetime.date'>
date对象支持的属性方法:
1)获取date对象的年月日属性(只读)
代码语言:javascript复制o_date = datetime.date.today()
print(o_date.year, o_date.month, o_date.day, sep = 't')
输出结果:
代码语言:javascript复制2022 7 7
2)日期增减
代码语言:javascript复制#使用timedelta来设置增加间隔,获取当前日期前三天和后三天的日期
o_date = datetime.date.today()
future_date = o_date datetime.timedelta(days = 3)
before_date = o_date datetime.timedelta(days = -3)
print(future_date, before_date, sep = 't')
输出结果:
代码语言:javascript复制2022-07-10 2022-07-04
注:timedelta只能按照天、时、分、秒增减,不能进行按月、按年增减。
如何实现按月、年增减?使用第三方库python-dateutil(注意库的名称)
代码语言:javascript复制from dateutil.relativedelta import relativedelta
future_date = o_date relativedelta(months = 2)
before_date = o_date relativedelta(years = -2)
print(o_date, future_date, before_date, sep = 't')
输出结果:
代码语言:javascript复制2022-07-07 2022-09-07 2020-07-07
3)日期替换
代码语言:javascript复制#使用date.replace(year, month, day)
o_date = datetime.date(2022, 7, 7)
day_date = o_date.replace(day = 15)
month_date = o_date.replace(month = 9)
new_date = o_date.replace(year = 2020, month = 6, day = 13)
print(o_date, day_date, month_date, new_date, sep = 't')
输出结果:
代码语言:javascript复制2022-07-07 2022-07-15 2022-09-07 2020-06-13
4)返回某个日期是星期的第几天
代码语言:javascript复制#5, 返回今天是一个星期的第几天,weekday中周一为0,isoweekday中周一为1
o_date = datetime.date.today()
weekday = o_date.weekday()
isoweekday =o_date.isoweekday()
print(o_date.weekday(), isoweekday, sep = 't')
输出结果:
代码语言:javascript复制3 4
今天是周四,在weekday中为3,在isoweekday中为4。
5)返回日历格式(年,第几周,周的第几天)
代码语言:javascript复制#返回colendar格式,(年,第几周,周的第几天)
o_date = datetime.date.today()
print(o_date.isocalendar())
输出结果,表示今天是2022年第27周第4天:
代码语言:javascript复制(2022, 27, 4)
6)date转字符串
代码语言:javascript复制o_date = datetime.date.today()
#返回一个以YYYY-MM-DD表示日期的字符串
isoformat = o_date.isoformat()
date_str = o_date.__str__() #等效isformat方法
#返回一个表示日期的字符串
ctime_date = o_date.ctime()
print(o_date, isoformat, date_str, sep = 't')
#返回指定格式的字符串(格式参考文章开头的符号)
format_1 = o_date.strftime('%y-%m')
format_2 = o_date.strftime('%Y.%m.%d %H:%M:%S')
print(o_date, format_1, format_2, sep = 't')
输出结果:
代码语言:javascript复制2022-07-07 2022-07-07 2022-07-07
2022-07-07 22-07 2022.07.07 00:00:00
7)日期大小比较
代码语言:javascript复制date1 = datetime.date(2022, 7, 8)
date2 = datetime.date(2022, 7, 3)
date1 < date2
输出结果为False,利用日期大小比较,并结合日期增减可以生成日期序列。
1.1.2 datetime对象
生成datetime对象方法
1)datetime.datetime方法
代码语言:javascript复制#datetime.datetime(year, month, day, hour, minute, second, microsecond)
import datetime
o_datetime = datetime.datetime(2022, 7, 7, 14)
print(o_datetime, type(o_datetime), sep = 't)
代码语言:javascript复制2022-07-07 14:00:00 <class 'datetime.datetime'>
2)字符串转datetime
代码语言:javascript复制#fromisoformat只适用于YYYY-MM-DD类型的字符串,后面的时分秒可以不要;
#strptime较为灵活,可以指定datetime样式
date_str = '2022-07-07 12:02:32'
iso_datetime = datetime.datetime.fromisoformat(date_str)
date_str = '2022/07 12:02'
str_to_date = datetime.datetime.strptime(date_str, '%Y/%m %H:%M')
print(iso_datetime, type(iso_datetime), date_str, type(str_to_date), sep = 't')
代码语言:javascript复制2022-07-07 12:02:32 <class 'datetime.datetime'> 2022/07 12:02 <class 'datetime.datetime'>
3)利用当前日期转为datetime
代码语言:javascript复制#当前日期转为datetime
o_datetime = datetime.datetime.today()
print(o_datetime, type(o_datetime), sep = 't')
代码语言:javascript复制2022-07-07 12:09:32.120532 <class 'datetime.datetime'>
4)日历格式转datetime
代码语言:javascript复制#datetime.fromisocalendar(year, week, day)
o_datetime = datetime.datetime.fromisocalendar(2022, 27, 4)
print(o_datetime, type(o_datetime), sep = 't')
代码语言:javascript复制2022-07-07 00:00:00 <class 'datetime.datetime'>
表示2022年第27周第4天的日期
5)时间戳转datetime
代码语言:javascript复制#datetime.datetime(time.time())
import time
o_datetime = datetime.datetime.fromtimestamp(time.time())
print(o_datetime, type(o_datetime), sep = 't')
代码语言:javascript复制2022-07-07 12:15:20.541538 <class 'datetime.datetime'>
注:datetime对象可以转为date,但是date不可以转为datetime
datetime对象支持的属性方法
1)获取年、月、日、时、分、秒、毫秒属性(只读)
代码语言:javascript复制o_datetime = datetime.datetime.today()
print(o_datetime.year, o_datetime.hour, sep = 't')
代码语言:javascript复制2022 12
2)时间增减,与上文一样,不再列举
3)datetime转为date
代码语言:javascript复制o_datetime = datetime.datetime.today()
o_date = o_datetime.date()
print(o_datetime, o_date, sep = 't')
代码语言:javascript复制2022-07-07 12:21:40.047070 2022-07-07
4)时间替换,与上文一样,不再列举
5)datetime转为time(时分秒)
代码语言:javascript复制o_datetime = datetime.datetime.today()
o_time = o_datetime.time()
print(o_datetime, o_time, sep = 't')
代码语言:javascript复制2022-07-07 12:23:37.465122 12:23:37.465122
6)转星期,方法同date
7)转日历型,方法同date
8)转字符串,方法同date
代码语言:javascript复制o_datetime = datetime.datetime.today()
isoformat = o_datetime.isoformat()
str_date = o_datetime.__str__()
str_format_date = o_datetime.strftime("%Y-%m-%d %H:%M:%S")
print(o_datetime, isoformat, str_date, str_format_date, sep = 't')
代码语言:javascript复制2022-07-07 12:30:38.085380 2022-07-07T12:30:38.085380 2022-07-07 12:30:38.085380 2022-07-07 12:30:38
9)转timetuple,date也可以用(可以用它获取今天是该年的第几天)
代码语言:javascript复制o_datetime = datetime.datetime.today()
time_tuple = o_datetime.timetuple()
print(time_tuple)
print('今年的第{}天'.format(time_tuple[-2]))
代码语言:javascript复制time.struct_time(tm_year=2022, tm_mon=7, tm_mday=7, tm_hour=12, tm_min=33, tm_sec=3, tm_wday=3, tm_yday=188, tm_isdst=-1)
今年的第188天
本文列举了datetime库中datetime和date两类对象,由于篇幅限制,time和timedelta对象可以参考python官方文档,链接如下:
https://docs.python.org/zh-cn/3/library/datetime.html#datetime.date.fromisoformat