タイムスタンプのあるデータがUTCで表示されます。このタイムスタンプのタイムゾーンを 'US/Pacific'に変換し、それを階層的なインデックスとしてpandas DataFrameに追加したいと思います。私はインデックスとしてタイムスタンプを変換することができましたが、DataFrameに列やインデックスとして追加しようとすると、タイムゾーンのフォーマットが失われます。pandasのdate-timeカラムのタイムゾーンを変更し、階層インデックスとして追加
>>> import pandas as pd
>>> dat = pd.DataFrame({'label':['a', 'a', 'a', 'b', 'b', 'b'], 'datetime':['2011-07-19 07:00:00', '2011-07-19 08:00:00', '2011-07-19 09:00:00', '2011-07-19 07:00:00', '2011-07-19 08:00:00', '2011-07-19 09:00:00'], 'value':range(6)})
>>> dat.dtypes
#datetime object
#label object
#value int64
#dtype: object
ここでシリーズを直接変換しようとするとエラーになります。
>>> times = pd.to_datetime(dat['datetime'])
>>> times.tz_localize('UTC')
#Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# File "/Users/erikshilts/workspace/schedule-detection/python/pysched/env/lib/python2.7/site-packages/pandas/core/series.py", line 3170, in tz_localize
# raise Exception('Cannot tz-localize non-time series')
#Exception: Cannot tz-localize non-time series
インデックスに変換すると、それはtimeseriesとして操作できます。インデックスに太平洋標準時が設定されていることに注目してください。
>>> times_index = pd.Index(times)
>>> times_index_pacific = times_index.tz_localize('UTC').tz_convert('US/Pacific')
>>> times_index_pacific
#<class 'pandas.tseries.index.DatetimeIndex'>
#[2011-07-19 00:00:00, ..., 2011-07-19 02:00:00]
#Length: 6, Freq: None, Timezone: US/Pacific
それは書式設定のタイムゾーンを失うしかし、今私は戻ってデータフレームにインデックスを追加する問題に実行:
>>> dat_index = dat.set_index([dat['label'], times_index_pacific])
>>> dat_index
# datetime label value
#label
#a 2011-07-19 07:00:00 2011-07-19 07:00:00 a 0
# 2011-07-19 08:00:00 2011-07-19 08:00:00 a 1
# 2011-07-19 09:00:00 2011-07-19 09:00:00 a 2
#b 2011-07-19 07:00:00 2011-07-19 07:00:00 b 3
# 2011-07-19 08:00:00 2011-07-19 08:00:00 b 4
# 2011-07-19 09:00:00 2011-07-19 09:00:00 b 5
あなたは、インデックスの代わりにUTCタイムゾーンに戻っているがわかります変換された太平洋標準時。
タイムゾーンを変更してDataFrameのインデックスとして追加するにはどうすればよいですか?
私はこれがバグだと思っています... –
これは奇妙な動作です(タイムゾーンは悪です)。おそらく[問題](https://github.com/pydata/pandas/issues)を作成する価値があります! –
「タイムゾーンは悪い」 - 二番目です。 – Jason