执行性能分析时,我很惊讶地发现 pd.to_datetime 对性能有很大的拖累(在我的用例中,91 秒中花费了 62 秒)。所以我可能没有按应有的方式使用该功能。
简单的示例案例,我需要将 timestamp = 623289600000000000L 转换为日期/时间戳格式。
import datetime
import time
import pandas as pd
timestamp = 623289600000000000L
timeit pd.to_datetime(timestamp, unit = 'ns')
10000 loops, best of 3: 46.9 us per loop
In [3]: timeit time.ctime(timestamp/10**9)
1000000 loops, best of 3: 904 ns per loop
timeit time.localtime(timestamp/10**9)
1000000 loops, best of 3: 1.13 us per loop
timeit datetime.datetime.fromtimestamp(timestamp/10**9)
1000000 loops, best of 3: 1.51 us per loop
timeit datetime.datetime.utcfromtimestamp(timestamp/10**9)
1000000 loops, best of 3: 1.29 us per loop
我知道这些函数各自返回不同的对象,但是 pd.to_datetime 是迄今为止最慢的。这是预期的吗?
我现在在我的代码中使用 datetime.datetime.utcfromtimestamp 并且它工作正常。但是,我宁愿继续使用 Pandas。 Plus Pandas 可以很好地处理 1970 年前的日期(见下文)。你能提供一些指导吗?
pd.to_datetime 有一个优势:它支持负数输入/1970-01-01 之前的日期。这对我的用例也很重要。
timestamp =-445645400000000000L
pd.to_datetime(timestamp, unit = 'ns')
Timestamp('1955-11-18 01:36:40', tz=None)
datetime.datetime.utcfromtimestamp(timestamp/10**9)
Traceback (most recent call last):
File "<ipython-input-9-99b040d30a3e>", line 1, in <module>
datetime.datetime.utcfromtimestamp(timestamp/10**9)
ValueError: timestamp out of range for platform localtime()/gmtime() function
我在 Windows 7 上使用 Python 2.7.5 和 Pandas 0.12.0。
请您参考如下方法:
to_datetime 将通过多种方式解析时间戳参数,找出里面的时间戳是什么。将表示日期时间的字符串转换为时间戳对象很有用。
如果你操作的数据已经是一个timestamp int,你可以直接调用Timestamp对象来构建:
pd.Timestamp(timestamp)
Out[51]: Timestamp('1989-10-02 00:00:00', tz=None)
%timeit pd.Timestamp(timestamp)
100000 loops, best of 3: 1.96 µs per loop
它也适用于负数:
pd.Timestamp(-445645400000000000L)
Out[54]: Timestamp('1955-11-18 01:36:40', tz=None)
