2017-11-07 10 views
1

timeseriesデータを操作するために、DatetimeIndexでPandasデータフレームを使用しています。データはUTCの時刻に保存されています。私は通常そのように保ちます(ナイーブDatetimeIndex)。出力にのみタイムゾーンを使用します。世界の何も私がタイムゾーンを操作しようとする以上に私を混乱させないので、私はそのように好きです。再構成されたパンダデータフレームのタイムゾーンを変更

私は私はありません場合は、列

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 

のインデックスと日付に沿って時間を持つようにデータフレームの形を変えるように、今年の毎日のための時間に対するデータのグラフをプロットしたい

In: ts = pd.date_range('2017-01-01 00:00','2017-12-31 23:30',freq='30Min') 
    data = np.random.rand(17520,1) 
    df= pd.DataFrame(data,index=ts,columns = ['data']) 
    df.head() 

Out[15]: 
         data 
2017-01-01 00:00:00 0.697478 
2017-01-01 00:30:00 0.506914 
2017-01-01 01:00:00 0.792484 
2017-01-01 01:30:00 0.043271 
2017-01-01 02:00:00 0.558461 

タイムゾーンを心配して、私は次のようにプロットすることができます

fig, ax = plt.subplots() 
ax.plot(df_new.index,df_new) 

が、私は、ローカルタイムゾーンでデータをプロットしたい(tz = pytz.timezone('Australia/Sydney'を)夏時間のための手当を作りますが、回nd日付はもはや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) 

ただし、機能の書き込み方法はわかりませんshift_by特定の時間帯にデータフレームの日付を変換する (これは理想的ではありませんが、私は一緒に暮らすことができた、正しくTEH切日午前2時に真夜中に対応していない)

+0

IIUC、 'df.index = df.index.tz_localize( 'UTC')tz_convert( 'オーストラリア/シドニー')':。またでサブプロットを作成しますか? –

+0

それは簡単でした。私はそれが適切な食事を出していた。ありがとうございました。 – doctorer

+0

私はそれが動作するかどうか私に教えてください(私は100%確かではない、私はスタッキング/プロットをしなかった)ので、私は答えを投稿します。 –

答えて

2

使用dt.tz_localize + dt.tz_convert

df = df[~df.index.duplicated()] 
df = df['data'].unstack() 

することができます:あなたが観察されるように、それは重複タイムスタンプの2つの行を作成しますので、その場合は、duplicatedでそれを取り除く - MuliIndexを作成する場合は少し注意が必要です

df.index = df.index.tz_localize('UTC').tz_convert('Australia/Sydney') 
df.index = [df.index.time, df.index.date] 

df.plot(subplots=True) 
plt.show() 
関連する問題