时间戳(timestamp),特定的时刻
固定时期(period),如2017年1月或2017年全年
时间间隔(interval), 由起始和结束时间戳表示
实验或过程时间,每个时间点都有相对于特定起始时间的一个度量
1、日期和时间数据类型及工具
from datetime import datetimenow = datetime.now()nowOut[63]: datetime.datetime(2017, 9, 14, 17, 19, 5, 215000)now.year, now.month, now.dayOut[64]: (2017, 9, 14)
datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差
delta = datetime(2017, 9, 14) - datetime(2016, 6, 24, 8, 15)deltadelta.daysdelta.seconds Out[66]: datetime.timedelta(446, 56700) delta.days Out[67]: 446 delta.seconds Out[69]: 56700
可以给datetime对象加上(或减去)一个或多个timedelta,这样会产生一个新对象
from datetime import timedeltastart = datetime(2017, 1, 7)start + timedelta(12)Out[72]: datetime.datetime(2017, 1, 19, 0, 0)start - 2 * timedelta(12)Out[73]: datetime.datetime(2016, 12, 14, 0, 0)
datetime模块中的数据类型
2、 字符串和datetime的相互转换
利用str 或 strftime方法, datetime对象和pandas 的 timestamp对象可以被格式化字符串
stamp = datetime(2017, 1, 3)str(stamp)Out[75]: '2017-01-03 00:00:00'stampOut[76]: datetime.datetime(2017, 1, 3, 0, 0)stamp.strftime('%Y - %m - %d')Out[77]: '2017 - 01 - 03'stamp.strftime('%Y-%m-%d')Out[78]: '2017-01-03'
value = '2017-09-14'datetime.strptime(value, '%Y-%m-%d')Out[86]: datetime.datetime(2017, 9, 14, 0, 0)datestrs = ['7/6/2017', '8/6/2017'][datetime.strptime(x, '%m/%d/%Y') for x in datestrs]Out[88]: [datetime.datetime(2017, 7, 6, 0, 0), datetime.datetime(2017, 8, 6, 0, 0)]
datetime.strptime是通过已知格式进行日期解析的最佳方式。但是是件很麻烦的事情,可以用dateutil这个第三方包中的parser.parse方法
from dateutil.parser import parseparse('2017-09-14')Out[90]: datetime.datetime(2017, 9, 14, 0, 0)
dateutil可以解析几乎所有人类能够理解的日期表示形式,但中文不行
parse('Jan 31, 2017 10:45 PM')Out[91]: datetime.datetime(2017, 1, 31, 22, 45)
在国际通用的格式中,日通常出现在月的前面,传入dayfirst = True 即可解决这个问题
parse('9/12/2017',dayfirst = True)Out[92]: datetime.datetime(2017, 12, 9, 0, 0)
用pandas中 to_datetime方法可以解析多种不同的日期表示形式,对标准日期格式解析非常快
datestrsOut[93]: ['7/6/2017', '8/6/2017']import pandas as pdpd.to_datetime(datestrs)Out[95]: DatetimeIndex(['2017-07-06', '2017-08-06'], dtype='datetime64[ns]', freq=None)
它还可以处理缺失值(None, 空字符串)
idx = pd.to_datetime(datestrs + [None])idxOut[97]: DatetimeIndex(['2017-07-06', '2017-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
idx[2]Out[98]: NaTpd.isnull(idx)Out[99]: array([False, False, True], dtype=bool)
NaT(Not a Time)是pandas中时间戳数据的NA值
注意:dateutil.parser是一个实用但不完美的工具。会把一些原本不是日期的字符串认作是日期
datetime的格式定义
datetime对象还有一些特定于当前环境的格式化选项