为什么使用Pandas.to_datetime进行日期转换比某些替代方案要慢得多?

Sam*_*Sam 1 python pandas

执行性能分析时,我非常惊讶地认为pd.to_datetime它是对性能的一大阻力(在我的用例中花费了91秒,耗费了91秒).所以我可能没有像我应该那样使用这个功能.

简单的示例情况,我需要转换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
Run Code Online (Sandbox Code Playgroud)

我知道这些函数每个返回一个不同的对象,但是pd.to_datetime到目前为止是最慢的.这是预期的吗?

我现在datetime.datetime.utcfromtimestamp在我的代码中使用,它工作正常.但是,我宁愿继续使用熊猫.加上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
Run Code Online (Sandbox Code Playgroud)

我在Windows 7上使用Python 2.7.5和Pandas 0.12.0.

Bou*_*oud 5

to_datetime将以几种方式解析timestamp参数,以找出里面的时间戳.将表示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
Run Code Online (Sandbox Code Playgroud)

它也适用于负数:

pd.Timestamp(-445645400000000000L)
Out[54]: Timestamp('1955-11-18 01:36:40', tz=None)
Run Code Online (Sandbox Code Playgroud)