时间戳(timestamp),特定的时刻
固定时期(period),如2017年1月或2017年全年
时间间隔(interval), 由起始和结束时间戳表示
实验或过程时间,每个时间点都有相对于特定起始时间的一个度量
1、日期和时间数据类型及工具
from datetime import datetime now = datetime.now() now Out[63]: datetime.datetime(2017, 9, 14, 17, 19, 5, 215000) now.year, now.month, now.day Out[64]: (2017, 9, 14)
datetime以毫秒形式存储日期和时间,datetime.timedelta表示两个datetime对象之间的时间差
delta = datetime(2017, 9, 14) - datetime(2016, 6, 24, 8, 15)
delta
delta.days
delta.seconds
Out[66]: datetime.timedelta(446, 56700)
delta.days
Out[67]: 446
delta.seconds
Out[69]: 56700
可以给datetime对象加上(或减去)一个或多个timedelta,这样会产生一个新对象
from datetime import timedelta start = 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' stamp Out[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 parse parse('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方法可以解析多种不同的日期表示形式,对标准日期格式解析非常快
datestrs Out[93]: ['7/6/2017', '8/6/2017'] import pandas as pd pd.to_datetime(datestrs) Out[95]: DatetimeIndex(['2017-07-06', '2017-08-06'], dtype='datetime64[ns]', freq=None)
它还可以处理缺失值(None, 空字符串)
idx = pd.to_datetime(datestrs + [None]) idx Out[97]: DatetimeIndex(['2017-07-06', '2017-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
idx[2] Out[98]: NaT pd.isnull(idx) Out[99]: array([False, False, True], dtype=bool)
NaT(Not a Time)是pandas中时间戳数据的NA值
注意:dateutil.parser是一个实用但不完美的工具。会把一些原本不是日期的字符串认作是日期
datetime的格式定义
datetime对象还有一些特定于当前环境的格式化选项