Skip to main content
 首页 » 编程设计

python之为什么使用 Pandas.to_datetime 进行的这种日期转换比某些替代方法慢得多

2025年05月04日9lautakyan007

执行性能分析时,我很惊讶地发现 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)