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
时间,我通常保持这种方式(使用naive
DatetimeIndex
),并且只使用时区进行输出。我喜欢这种方式,因为世界上没有什么比试图调整时区更让我困惑的了

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()