Python 改变数据帧形状的时区
我正在使用带有Python 改变数据帧形状的时区,python,pandas,timezone,Python,Pandas,Timezone,我正在使用带有DatetimeIndex的Pandas数据帧来操作timeseries数据。数据存储在UTC时间,我通常保持这种方式(使用naiveDatetimeIndex),并且只使用时区进行输出。我喜欢这种方式,因为世界上没有什么比试图调整时区更让我困惑的了 e、 g 我想为一年中的每一天绘制一张数据与时间的图表,这样我就可以重塑数据框架,使其在索引和列日期上都有时间 df.index = [df.index.time,df.index.date] df_new = df['data'].
DatetimeIndex
的Pandas数据帧来操作timeseries数据。数据存储在UTC
时间,我通常保持这种方式(使用naiveDatetimeIndex
),并且只使用时区进行输出。我喜欢这种方式,因为世界上没有什么比试图调整时区更让我困惑的了
e、 g
我想为一年中的每一天绘制一张数据与时间的图表,这样我就可以重塑数据框架,使其在索引和列日期上都有时间
df.index = [df.index.time,df.index.date]
df_new = df['data'].unstack()
In: df_new.head()
Out :
2017-01-01 2017-01-02 2017-01-03 2017-01-04 2017-01-05 \
00:00:00 0.697478 0.143626 0.189567 0.061872 0.748223
00:30:00 0.506914 0.470634 0.430101 0.551144 0.081071
01:00:00 0.792484 0.045259 0.748604 0.305681 0.333207
01:30:00 0.043271 0.276888 0.034643 0.413243 0.921668
02:00:00 0.558461 0.723032 0.293308 0.597601 0.120549
如果我不担心时区,我可以这样画:
fig, ax = plt.subplots()
ax.plot(df_new.index,df_new)
但是我想在本地时区(tz=pytz.timezone(
)中绘制数据,考虑到夏令时,但是时间和日期不再是Timestamp
对象,所以我不能使用Pandas时区处理。或者我可以吗
假设我不能,我正在尝试手动换档(假设DST在凌晨2点开始1/10,在凌晨2点结束1/4),所以我已经做到了:
df_new[[c for c in df_new.columns if c >= dt.datetime(2017,4,1) and c <dt.datetime(2017,10,1)]].shift_by(+10)
df_new[[c for c in df_new.columns if c < dt.datetime(2017,4,1) or c >= dt.datetime(2017,10,1)]].shift_by(+11)
df_new[[如果c>=dt.datetime(2017,4,1)和c=dt.datetime(2017,10,1)],则df_new.columns中的c代表c。按(+11)移位
但是我不知道如何编写函数shift\u by
。
(这不能正确处理转换日的午夜到凌晨2点,这并不理想,但我可以接受)使用
dt.tz_本地化
+dt.tz_转换
将数据帧日期转换为特定时区
df.index = df.index.tz_localize('UTC').tz_convert('Australia/Sydney')
df.index = [df.index.time, df.index.date]
创建MuliIndex
时要小心一点-正如您所观察到的,它会创建两行重复的时间戳,因此如果是这种情况,请使用duplicated
将其删除:
df = df[~df.index.duplicated()]
df = df['data'].unstack()
您还可以使用df.plot
创建子图:
df.plot(subplots=True)
plt.show()
IIUC,
df.index=df.index.tz_localize('UTC')。tz_convert('Australia/Sydney')
?这很简单。我在外面做了一顿正餐。谢谢。让我知道它是否有效(我不是100%确定,我没有做叠加/绘图),所以我会发布一个答案。是的,效果很好。(很明显,它会在秋季创建两个小时的重复时间戳,在春季创建两个小时的缺失时间戳,但在绘图时不会抛出异常,因此我不确定它是如何处理重复时间戳的。)。谢谢
df.plot(subplots=True)
plt.show()