TimeZonewarePandasDateTimeIndex的性能

2024-10-01 13:39:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在网上搜索,但没有找到我所面临的问题。在

看来熊猫.DataFrame对具有时区感知日期的索引的操作比在常规日期时间上慢一个数量级。在

这是ipython的计时。在

首先使用标准日期时间:

import pandas as pd
import numpy as np

dates=pd.date_range('2010/01/01 00:00:00', '2010/12/31 00:00:00', freq='1T')
DF=pd.DataFrame(data=np.random.rand(len(dates)), index=dates, columns=["value"])

# compute timedeltas between dates
%timeit DF["temp"] = DF.index
%timeit DF["deltas"] = (DF["temp"] - DF["temp"].shift())

结果是:

^{pr2}$

到目前为止,还不错。在

现在只需添加时区信息:

import pandas as pd
import numpy as np

dates=pd.date_range('2010/01/01 00:00:00', '2010/12/31 00:00:00', freq='1T')
# NEW: filter dates to avoid DST problems
dates=dates[dates.hour>2] # to avoid AmbiguousInferError or NonExistentDateError

DF=pd.DataFrame(data=np.random.rand(len(dates)), index=dates, columns=["value"])

# NEW: add timezone info
DF.index = DF.index.tz_localize(tz="America/New_York", ambiguous="infer")

# compute timedeltas between dates
%timeit DF["temp"] = DF.index
%timeit DF["deltas"] = (DF["temp"] - DF["temp"].shift())

现在,结果是:

1 loops, best of 3: 5.43 s per loop
1 loops, best of 3: 16 s per loop

为什么呢??
我真的不明白这里的瓶颈在哪里。。。在

有关信息(来自conda list):

anaconda                  2.2.0                np19py34_0  
conda                     3.12.0                   py34_0  

numpy                     1.9.2                    py34_0  
pandas                    0.16.1               np19py34_0  
pytz                      2015.4                   py34_0  
scipy                     0.15.1               np19py34_0  

Tags: importnumpydataframepandasdfindexasnp
1条回答
网友
1楼 · 发布于 2024-10-01 13:39:53

这是一个已知问题,请参见here。 带有naivetz(例如没有时区)Series的日期时间用datetime64[ns]的数据类型有效地表示。使用int64的计算非常快。tz感知Series使用object数据类型表示。这些计算比较慢。在

有可能解决这个问题(请参阅参考问题),使其具有统一的tz-aware Series。欢迎拉请求!在

In [9]: df = DataFrame({'datetime' : pd.date_range('20130101',periods=5), 'datetime_with_tz' : pd.date_range('20130101',periods=5,tz='US/Eastern')})

In [10]: df 
Out[10]: 
    datetime           datetime_with_tz
0 2013-01-01  2013-01-01 00:00:00-05:00
1 2013-01-02  2013-01-02 00:00:00-05:00
2 2013-01-03  2013-01-03 00:00:00-05:00
3 2013-01-04  2013-01-04 00:00:00-05:00
4 2013-01-05  2013-01-05 00:00:00-05:00

In [11]: df.dtypes
Out[11]: 
datetime            datetime64[ns]
datetime_with_tz            object
dtype: object

相关问题 更多 >