我认为有必要更加集中的努力来解释Python的datetime模块、numpy的datetime64/timedelta64和pandas的Timestamp/Timedelta对象之间的关系。
Python的datetime标准库
Python的datetime标准库有四个主要对象:
- time - 只包含时间,以小时、分钟、秒和微秒表示
- date - 只包含年、月和日
- datetime - 时间和日期的所有组成部分
- timedelta - 最大单位为天的一段时间
创建这四个对象
>>> import datetime
>>> datetime.time(hour=4, minute=3, second=10, microsecond=7199)
datetime.time(4, 3, 10, 7199)
>>> datetime.date(year=2017, month=10, day=24)
datetime.date(2017, 10, 24)
>>> datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 24, 4, 3, 10, 7199)
>>> datetime.timedelta(days=3, minutes = 55)
datetime.timedelta(3, 3300)
>>>
>>> datetime.timedelta(days=3, minutes = 55) + \
datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 27, 4, 58, 10, 7199)
NumPy的datetime64和timedelta64对象
NumPy没有单独的日期和时间对象,只有一个datetime64对象来表示某个时间点。datetime模块的datetime对象精确到微秒(一百万分之一秒)。NumPy的datetime64对象允许您将其精度设置从小时到attoseconds(10 ^ -18)。它的构造函数更灵活,可以接受各种输入。
构建NumPy的datetime64和timedelta64对象
传递一个带有字符串单位的整数。在此处查看所有单位。 它会在UNIX纪元:1970年1月1日之后转换为这么多个单位。
>>> np.datetime64(5, 'ns')
numpy.datetime64('1970-01-01T00:00:00.000000005')
>>> np.datetime64(1508887504, 's')
numpy.datetime64('2017-10-24T23:25:04')
只要字符串符合ISO 8601格式,您也可以使用它们。
>>> np.datetime64('2017-10-24')
numpy.datetime64('2017-10-24')
时间增量只有一个单位
>>> np.timedelta64(5, 'D') # 5 days
>>> np.timedelta64(10, 'h') 10 hours
也可以通过减去两个datetime64对象来创建它们
>>> np.datetime64('2017-10-24T05:30:45.67') - np.datetime64('2017-10-22T12:35:40.123')
numpy.timedelta64(147305547,'ms')
Pandas的时间戳和时间增量在NumPy的基础上构建了更多功能
Pandas的时间戳(Timestamp)类似于datetime,但具有更强的功能。您可以使用pd.Timestamp
或pd.to_datetime
构造它们。
>>> pd.Timestamp(1239.1238934) #defaults to nanoseconds
Timestamp('1970-01-01 00:00:00.000001239')
>>> pd.Timestamp(1239.1238934, unit='D') # change units
Timestamp('1973-05-24 02:58:24.355200')
>>> pd.Timestamp('2017-10-24 05') # partial strings work
Timestamp('2017-10-24 05:00:00')
pd.to_datetime
的工作方式非常类似(有更多选项),可以将字符串列表转换为时间戳。
>>> pd.to_datetime('2017-10-24 05')
Timestamp('2017-10-24 05:00:00')
>>> pd.to_datetime(['2017-1-1', '2017-1-2'])
DatetimeIndex(['2017-01-01', '2017-01-02'], dtype='datetime64[ns]', freq=None)
将Python datetime转换为datetime64和Timestamp
>>> dt = datetime.datetime(year=2017, month=10, day=24, hour=4,
minute=3, second=10, microsecond=7199)
>>> np.datetime64(dt)
numpy.datetime64('2017-10-24T04:03:10.007199')
>>> pd.Timestamp(dt)
Timestamp('2017-10-24 04:03:10.007199')
将numpy的datetime64转换为datetime和Timestamp
>>> dt64 = np.datetime64('2017-10-24 05:34:20.123456')
>>> unix_epoch = np.datetime64(0, 's')
>>> one_second = np.timedelta64(1, 's')
>>> seconds_since_epoch = (dt64 - unix_epoch) / one_second
>>> seconds_since_epoch
1508823260.123456
>>> datetime.datetime.utcfromtimestamp(seconds_since_epoch)
>>> datetime.datetime(2017, 10, 24, 5, 34, 20, 123456)
转换为时间戳
>>> pd.Timestamp(dt64)
Timestamp('2017-10-24 05:34:20.123456')
将时间戳转换为datetime和datetime64
这非常容易,因为Pandas的时间戳功能非常强大。
>>> ts = pd.Timestamp('2017-10-24 04:24:33.654321')
>>> ts.to_pydatetime() # Python's datetime
datetime.datetime(2017, 10, 24, 4, 24, 33, 654321)
>>> ts.to_datetime64()
numpy.datetime64('2017-10-24T04:24:33.654321000')
numpy
和pandas
版本。 - jfspd.Timestamp(dt64).to_datetime()
。我仍然有点不满意,但肯定Wes'对我的旧问题不太具体(因此更适合世界)!再次感谢您抽出时间来回答它。 :) - Andy HaydenTimestamp
”,而Timestamp
本身就是datetime
(它的一个子类):) - jfs