python标准库中的datetime.datetime,time和calendar是处理时间和日期格式的常见模块,介绍其中的datetime:
from datetime import datetime
now = datetime.now()
now
datetime.datetime(2020, 2, 8, 16, 54, 18, 987524)
now.year, now.month, now.day
(2020, 2, 8)
datetime存储了精细化的时间数据,年月日时分秒和微秒的数据。
timedelta表示两个时间的时间差:
delta = datetime(2011, 1, 7) - datetime(2008, 6, 24, 8, 15)
delta
datetime.timedelta(days=926, seconds=56700)
delta.days, delta.seconds
(926, 56700)
同样我们可以使用时间戳和一个时间差计算新的时间:
from datetime import timedelta
start = datetime(2017, 1, 7)
start + timedelta(12) # 加上12天的时间差
datetime.datetime(2017, 1, 19, 0, 0)
start - 2 * timedelta(12) # 如果是我可能会考虑12 * 2
datetime.datetime(2016, 12, 14, 0, 0)
类型 | 描述 |
---|---|
date | 使用公历日历存储日历日期(年,月,日) |
time | 将时间存储为小时、分钟、秒和微秒 |
datetime | 存储日期和时间 |
timedelta | 表示两个datetime之间的差(如日、秒和微秒) |
tzinfo | 用于存储时区信息的基本类型 |
这是一个开放的命题:
这里主要介绍datetime的处理方式:
stamp = datetime(2011, 1, 3)
str(stamp)
'2011-01-03 00:00:00'
stamp.strftime('%Y/%m/%d')
'2011/01/03'
类型 | 描述 |
---|---|
%Y | 四位的年份 |
%y | 两位的年份 |
%m | 两位的月份[01, 12] |
%d | 两位的日期[01, 31] |
%H | 小时,24小时制[00, 23] |
%I | 小时,12小时制[01, 12] |
%M | 两位的分钟[00, 59] |
%S | 秒[00, 61](60、61是闰秒) |
%w | 星期日期[0(星期天), 6] |
%U | 一年中的星期数[00, 53]。以星期天为每一周的第一天,一年中第一个星期天前的日期作为“第0周” |
%W | 一年中的星期数[00, 53]。以星期一为每一周的第一天,一年中第一个星期一前的日期作为“第0周” |
%z | 格式为+HHMM或-HHMM的UTC时区偏移;如果没有时区则为空 |
%F | %Y-%m-%d的简写(2012-04-18) |
%D | %m/%d/%y的简写(04/18/12) |
value = '2011-01-03'
datetime.strptime(value, '%Y-%m-%d')
datetime.datetime(2011, 1, 3, 0, 0)
datestrs = ['7/6/2011', '8/6/2011']
[datetime.strptime(date, '%m/%d/%Y') for date in datestrs]
[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]
datetime.strptime
在已知格式下处理比较好,每次都要手动编写格式代码有点繁琐。对于通用日期格式我们可以使用第三方的dateutil包里的parser.parse
方法(pandas安装时会自行安装这个包):
from dateutil.parser import parse
parse('2011-01-09')
datetime.datetime(2011, 1, 9, 0, 0)
dateutil能解析大部分人类理解的日期表达:
parse('Jan 31, 1997 10:45 PM')
datetime.datetime(1997, 1, 31, 22, 45)
不常出现的日期在月份前面可以指定参数实现:
parse('6/12/2011', dayfirst=True)
datetime.datetime(2011, 12, 6, 0, 0)
parse('6/12/42') # 如果你要的是1942年就要小心了
datetime.datetime(2042, 6, 12, 0, 0)
pandas处理时间基本上是基于时间序列的,会在后续推出相关内容,喜欢点赞收藏评论!