Python Pandas: Hỗ trợ 25 giờ trong chỉ mục datetime
Tôi muốn sử dụng ngày / giờ làm chỉ mục cho khung dữ liệu trong Pandas.
Tuy nhiên, thời gian tiết kiệm ánh sáng ban ngày không được giải quyết chính xác trong cơ sở dữ liệu, vì vậy các giá trị ngày / giờ cho ngày mà thời gian tiết kiệm ánh sáng ban ngày kết thúc có 25 giờ và được biểu thị như sau:
2019102700
2019102701
...
2019102724
Tôi đang sử dụng mã sau để chuyển đổi các giá trị đó thành một DateTime
đối tượng mà tôi sử dụng làm chỉ mục cho khung dữ liệu Pandas:
df.index = pd.to_datetime(df["date_time"], format="%Y%m%d%H")
Tuy nhiên, điều đó gây ra lỗi:
ValueError: unconverted data remains: 4
Có lẽ là vì to_datetime
hàm không mong đợi giờ 24
. Tương tự, ngày bắt đầu tiết kiệm ánh sáng ban ngày chỉ có 23 giờ.
Một giải pháp mà tôi nghĩ đến là lưu trữ ngày tháng dưới dạng chuỗi, nhưng điều đó có vẻ không thanh lịch và hiệu quả. Có cách nào giải quyết vấn đề xử lý tiết kiệm ánh sáng ban ngày khi sử dụng to_datetime
không?
Trả lời
Nếu bạn biết múi giờ, đây là cách để tính dấu thời gian UTC. Chỉ phân tích cú pháp phần ngày tháng, bản địa hóa theo múi giờ thực mà dữ liệu "thuộc về" và chuyển đổi thành UTC. Bây giờ bạn có thể phân tích cú pháp phần giờ và thêm nó dưới dạng đồng bằng thời gian - ví dụ:
import pandas as pd
df = pd.DataFrame({'date_time_str': ['2019102722','2019102723','2019102724',
'2019102800','2019102801','2019102802']})
df['date_time'] = (pd.to_datetime(df['date_time_str'].str[:-2], format='%Y%m%d')
.dt.tz_localize('Europe/Berlin')
.dt.tz_convert('UTC'))
df['date_time'] += df['date_time_str'].str[-2:].astype('timedelta64[h]')
# df['date_time']
# 0 2019-10-27 20:00:00+00:00
# 1 2019-10-27 21:00:00+00:00
# 2 2019-10-27 22:00:00+00:00
# 3 2019-10-27 23:00:00+00:00
# 4 2019-10-28 00:00:00+00:00
# 5 2019-10-28 01:00:00+00:00
# Name: date_time, dtype: datetime64[ns, UTC]
Tôi không chắc đó là giải pháp thanh lịch hay hiệu quả nhất, nhưng tôi sẽ:
df.loc[df.date_time.str[-2:]=='25', 'date_time'] = (pd.to_numeric(df.date_time[df.date_time.str[-2:]=='25'])+100-24).apply(str)
df.index = pd.to_datetime(df["date_time"], format="%Y%m%d%H")