Python Pandas:时区转换后重新索引DataFrame

3

我们考虑以下跨越1月16日上午10点到下午4点的DataFrame:

date_range1 = pd.date_range(dt(2017,1,16,10), dt(2017,1,16, 20), freq='2H')
df = pd.DataFrame(data = np.random.rand(len(date_range1),2), index = date_range1)

我使用稍微长一点的DateTimeindex重新索引它,时间跨度从0am到11pm,并获得了所需的结果,在0-10am和4-11pm之间的时间范围内填充NaN,因为那里没有数据:

date_range2 = pd.date_range(dt(2017,1,16,0), dt(2017,1,16, 23), freq='2H')
df.reindex(date_range2)

enter image description here

然而,如果我先修改df的时区,然后执行相同的重新索引操作,将得到一个完全填充NaN值的DataFrame:
df = df.tz_localize("Europe/Helsinki").tz_convert('UTC')  
df.reindex(date_range2)

enter image description here

有人知道这里发生了什么吗?


这对我来说看起来像是一个 bug,新的索引具有时区感知能力,但它是 UTC,因此应该能够处理任何日期时间索引,我将在 Github 上发布一个 bug。链接 - EdChum
不是一个错误;UTC与naive完全不同。 - Jeff
1个回答

3

修复:

一个解决方法是在将时区感知(tz)的 DateTimeIndex 转换为 UTC 时间后,使用 tz_convert(None) 去掉时区信息,这样它们之间的差异(这里是 UTC+02:00)就会添加到结果时间戳中。

然后,这些时间戳将能够正确地重新索引。

np.random.seed(42)
df1 = df.tz_localize("Europe/Helsinki").tz_convert('UTC').tz_localize(None)
df1.reindex(date_range2)

enter image description here


正确方法:

默认情况下,pd.date_range中的tz关键字参数为None而不是"UTC"。因此我们需要相应地进行更改,因为在重新索引时会通过比较它们的UTC时间戳来执行操作:

date_range2.tz = 'UTC'
df1 = df.tz_localize("Europe/Helsinki").tz_convert('UTC')
df1.reindex(date_range2)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接