Python pandas tz_localize 抛出 NonExistentTimeError,然后无法丢弃错误时间
Posted
技术标签:
【中文标题】Python pandas tz_localize 抛出 NonExistentTimeError,然后无法丢弃错误时间【英文标题】:Python pandas tz_localize throws NonExistentTimeError, then unable to drop erroneous times 【发布时间】:2015-01-20 00:51:49 【问题描述】:在 python pandas 中,我有一个如下所示的数据集:
对于 2007-04-26 17:00:00 之前的数据,时区为美国/东部。对于之后的数据,时区为 American/Chicago。
当我运行这个时:
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
有谁知道我可以如何简单地转换这些时间?任何帮助将不胜感激。
谢谢, 亚历克斯
更新以添加更多信息:
好的,我使用了以下代码来减少违规时间:
更新 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
对此有什么想法吗?我做了一些谷歌搜索,但找不到任何真正相关的内容..
【问题讨论】:
您能否发布“2006-04-02 02:00:00”的行以及您要删除的某些行?似乎这些数据点丢失了,很可能是因为您所说的 DST。 【参考方案1】:根据文档中的描述,您的 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]
可能还有一种方法可以让 drop 也起作用。检查这个相关问题: Deleting rows of daylight saving time from a time indexed pandas dataframe
【讨论】:
谢谢!这可以删除行。快速跟进:我对掩码不太熟悉..你知道我可以使用什么语法来基本上使它“和”我想省略的其他时间窗口吗?有没有比为每个时间窗口添加掩码(例如掩码1、掩码2、掩码3)更简洁的方法?再次感谢! mask = ((df.foo-2)) 是一般的想法。使用 |对于或和 & 对于和。如果这对您有帮助,请接受这个问题:) 好的,我打算 - 你认为你可以看看我的第二次更新,看看你是否知道解决方案?我真的很想解决这个 DST 问题,以便我可以真正使用我的数据集 您正在尝试分配给 data_filtered.ix 应该将 ix 更改为索引以上是关于Python pandas tz_localize 抛出 NonExistentTimeError,然后无法丢弃错误时间的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中,将 tz_localize 用于忽略 DST 的时间序列的最佳方法是啥?
pandas使用to_datetime函数将时间字符串转化为时间对象使用dt.tz_localize为转化后的时间对象添加时区信息(timezone)