Python Pandas: Hỗ trợ 25 giờ trong chỉ mục datetime

Aug 16 2020

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_datetimehà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_datetimekhông?

Trả lời

1 MrFuppes Aug 16 2020 at 18:40

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]
1 hoomant Aug 16 2020 at 17:43

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