Tôi có dữ liệu có dấu thời gian trong UTC. Tôi muốn chuyển đổi múi giờ của dấu thời gian này thành 'US/Pacific' và thêm múi giờ đó làm chỉ mục phân cấp cho DataFrame gấu trúc. Tôi đã có thể chuyển đổi dấu thời gian dưới dạng Chỉ mục, nhưng nó mất định dạng múi giờ khi tôi cố thêm lại dấu thời gian vào DataFrame, dưới dạng cột hoặc làm chỉ mục.Thay đổi múi giờ của cột ngày giờ trong gấu trúc và thêm làm chỉ mục phân cấp
>>> 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
Bây giờ, nếu tôi cố gắng chuyển đổi trực tiếp Series, tôi gặp lỗi.
>>> 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
Nếu tôi chuyển đổi nó thành chỉ mục thì tôi có thể điều khiển nó thành một bộ đếm thời gian. Lưu ý rằng chỉ mục hiện có múi giờ Thái Bình Dương.
>>> 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
Tuy nhiên, bây giờ tôi chạy vào vấn đề thêm các chỉ số trở lại dataframe vì nó mất định dạng múi giờ của nó:
>>> 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
Bạn sẽ nhận thấy các chỉ số đã trở lại trên múi giờ UTC thay vì múi giờ Thái Bình Dương được chuyển đổi.
Làm cách nào để thay đổi múi giờ và thêm múi giờ đó làm chỉ mục cho DataFrame?
Tôi nghĩ đây là lỗi ... –
Vâng, đây là hành vi lạ (múi giờ là ác). Có lẽ đáng để tạo [vấn đề] (https://github.com/pydata/pandas/issues)! –
"múi giờ là điều ác" - được ưu tiên. – Jason