Python 标准库包含用于日期(date)和时间(time)数据的数据类型,而且还有日历方面的功能,我们主要会用到datetime、time以及calendar模块。datetime.datetime 是用的最多的数据类型:
In [1]: from datetime import datetime
In [2]: now = datetime.now()
In [3]: now
Out[3]: datetime.datetime(2018, 4, 1, 9, 29, 4, 258841)
In [4]: now.year, now.month,now.day
Out[4]: (2018, 4, 1)
datetime 以毫秒形式存储日期和时间。datetime.timedelta 表示两个 datetime 对象之间的时间差,也可以给初始时间加上或者减去一个或者多个timedelta,来产生一个新的 datetime
In [8]:from datetime import timedelta
In [9]: delta = datetime(2011,1,7) - datetime(2008,6,24,8,15)
In [10]: delta
Out[10]: datetime.timedelta(926, 56700) #分别表示天数 和秒数
In [11]: delta.days
Out[11]: 926
In [12]: delta.seconds
Out[12]: 56700
In [13]: start = datetime(2011,1,7)
In [14]: start + timedelta(12)
Out[14]: datetime.datetime(2011, 1, 19, 0, 0)
因为datetime 是一种特定的时间表示格式 在使用中为了避免出现错误 我们常常需要将其转换为字符串 这就用到str 或者 strftime 方法:
In [13]: stamp = datetime(2011,1,3)
In [14]: str(stamp)
Out[14]: '2011-01-03 00:00:00'
In [16]: stamp.strftime('%Y-%m-%d')
Out[16]: '2011-01-03'
datetime.strptime() 是strftime 的相反方法 可以实现字符串向 datetime 的转换:
In [18]: value = '2011-01-03'
In [19]: datetime.strptime(value,'%Y-%m-%d') #每次都要编写格式定义
Out[19]: datetime.datetime(2011, 1, 3, 0, 0)
从上面可以知道 每次都要编写格式定义事非常麻烦的事情, 为了简单起间 可以使用dateutil 这个第三方包中的parser.parse 方法:
In [21]: from dateutil.parser import parse
In [23]: parse('2011-01-03') #传入 dayfirst =True 可以让日出现在月前面
Out[23]: datetime.datetime(2011, 1, 3, 0, 0)
#注意parser 是一个实用但是不完美的工具 ,比如传入单个数据 解析的结果无规律
In [38]: parse('12')
Out[38]: datetime.datetime(2018, 4, 12, 0, 0)
In [39]: parse('22')
Out[39]: datetime.datetime(2018, 4, 22, 0, 0)
In [40]: parse('42')
Out[40]: datetime.datetime(2042, 4, 1, 0, 0)
parse 虽然处理单个日期比较方便 但是在DateFrame 里面 处理日期列或者索引时候 (成组的日期)就没有办法了,这时候 使用 pandas 中的 to_datetime 就可以迅速解决
In [31]: import pandas as pd
In [32]: datestrs = ['4/2/2011','8/6/2013']
In [33]: pd.to_datetime(datestrs)
Out[33]: DatetimeIndex(['2011-04-02', '2013-08-06'], dtype='datetime64[ns]', freq=None)
In [34]: idx = pd.to_datetime(datestrs+[None]) #它还可以处理缺失值
In [35]: idx #NaT 是pandas中时间戳数据的NA值
Out[35]: DatetimeIndex(['2011-04-02', '2013-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
In [36]: pd.isnull(idx)
Out[36]: array([False, False, True])
datetime 格式定义
格式 含义 备注
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24小时制,00 - 23)
%I 第几个小时(12小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地am或者pm的相应符
%S 秒(01 - 61)
%U 一年中的星期数。(00 - 53星期天是一个星期的开始。)第一个星期天之前的所有天数都放在第0周。
%w 一个星期中的第几天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一为一个星期的开始。
%x 本地相应日期
%X 本地相应时间
%y 去掉世纪的年份(00 – 99)
%Y 完整的年份
%Z 时区的名字(如果不存在为空字符)
%% ‘%’字符