Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 时区感知的DateTimeIndex的性能_Python_Pandas_Pytz - Fatal编程技术网

Python 时区感知的DateTimeIndex的性能

Python 时区感知的DateTimeIndex的性能,python,pandas,pytz,Python,Pandas,Pytz,我在网上搜索了一下,但没有找到关于我所面临问题的任何信息 在具有时区感知日期的索引上,pandas.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.rando

我在网上搜索了一下,但没有找到关于我所面临问题的任何信息

在具有时区感知日期的索引上,pandas.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())
结果如下:

1000 loops, best of 3: 1.13 ms per loop
100 loops, best of 3: 17.1 ms per loop
1 loops, best of 3: 5.43 s per loop
1 loops, best of 3: 16 s per loop
到目前为止,一切顺利

现在只需添加时区信息:

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())
现在,结果是:

1000 loops, best of 3: 1.13 ms per loop
100 loops, best of 3: 17.1 ms per loop
1 loops, best of 3: 5.43 s per loop
1 loops, best of 3: 16 s per loop
这是为什么??
我真的不明白这里的瓶颈在哪里

有关信息(来自
conda列表)


这是一个已知问题,请参阅。 带有原始tz的日期时间(例如,无时区)
系列
用数据类型
datetime64[ns]
有效表示。使用int64等的计算速度非常快。tz aware
系列
使用
对象
数据类型表示。这些计算要慢一些

可以解决此问题(请参阅参考问题),以获得统一的tz-aware
系列。欢迎拉取请求

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

如果我只是使用tz_localize(tz=pytz.utc)将时区设置为utc,则计时时间为:11.4秒,而日期与标准日期时间完全没有变化。