Python pandas tz_localize抛出NonExistentTimeError,然后无法丢弃错误的时间

时间:2014-11-21 19:22:36

标签: python pandas timezone dst

在python pandas中,我有一个如下所示的数据集:

enter image description here

对于2007-04-26 17:00:00之前的数据,时区为美国/东部。对于以后的数据,时区是美国/芝加哥。

当我运行时:

data.index = data[:'2007-04-26 16:59:59'].index.tz_localize('US/Eastern', ambiguous = 'NaT').tz_convert('Europe/London')

我收到错误消息:

NonExistentTimeError: 2006-04-02 02:00:00

这确实是因为夏令时。我在2007年遇到了同样的问题。随后几年我没有这个问题。理想情况下,我想要两个命令 - 一个将数据集的前半部分从东部转换为伦敦,另一个将后半部分从芝加哥转换为伦敦。

由于那不起作用,我试着放弃这些时间(我相信一小时),例如。有夏令时的02:00:00到03:00:00但是,当我跑

data.drop(data.ix['2005-04-03 2:00:00':'2005-04-03 3:00:00'], inplace=True)

我得到了

ValueError: labels ['open' 'high' 'low' 'close' 'volume'] not contained in axis

有谁知道如何简单地转换这些时间?任何帮助将不胜感激。

谢谢, 亚历

更新以添加更多信息:

enter image description here

好的,我已经使用了以下代码来解决有问题的时间:

更新2:

mask =  ((data.index<datetime.strptime("2006-04-02 02:00:00","%Y-%m-%d %H:%S:%M")) | (data.index>datetime.strptime("2006-04-02 03:00:00","%Y-%m-%d %H:%S:%M"))) & ((data.index<datetime.strptime("2005-04-03 02:00:00","%Y-%m-%d %H:%S:%M")) | (data.index>datetime.strptime("2005-04-03 03:00:00","%Y-%m-%d %H:%S:%M"))) & ((data.index<datetime.strptime("2005-10-30 01:00:00","%Y-%m-%d %H:%S:%M")) | (data.index>datetime.strptime("2005-10-30 02:00:00","%Y-%m-%d %H:%S:%M"))) & ((data.index<datetime.strptime("2006-10-29 01:00:00","%Y-%m-%d %H:%S:%M")) | (data.index>datetime.strptime("2006-10-29 02:00:00","%Y-%m-%d %H:%S:%M")))
data_filtered = data[mask]
data_filtered.ix = data_filtered.tz_localize('US/Eastern', infer_dst=True).tz_convert('Europe/London')

但现在我收到了这个错误:

    data_filtered.ix = data_filtered.tz_localize('US/Eastern', infer_dst=True).tz_convert('Europe/London')
Traceback (most recent call last):

  File "<ipython-input-38-0fc8a9e68588>", line 1, in <module>
    data_filtered.ix = data_filtered.tz_localize('US/Eastern', infer_dst=True).tz_convert('Europe/London')

  File "C:\Anaconda\lib\site-packages\pandas\core\generic.py", line 1955, in __setattr__
    object.__setattr__(self, name, value)

AttributeError: can't set attribute

有关于此的任何想法吗?我做了一些谷歌搜索,但找不到任何真正相关的东西..

1 个答案:

答案 0 :(得分:2)

根据文档中的说明,您的drop命令看起来不应该起作用。为了摆脱有害的时间,我会在数据帧上创建一个掩码,即:

from datetime import datetime
mask =  ((df.index<datetime.strptime("2006-04-02 02:00:00","%Y-%m-%d %H:%S:%M") | (df.index>datetime.strptime("2006-04-02 03:00:00","%Y-%m-%d %H:%S:%M")) # probably add some    more years here as or clauses

df_filtered = df[mask]

也许还有一种让掉线工作的方法。检查这个相关问题: Deleting rows of daylight saving time from a time indexed pandas dataframe