पायथन पंडों: डेटाइम इंडेक्स में 25 घंटे का समर्थन

Aug 16 2020

मैं पंडों में डेटाफ्रेम के लिए एक सूचकांक के रूप में एक तिथि / समय का उपयोग करना चाहता हूं।

हालाँकि, डेलाइट सेविंग टाइम को डेटाबेस में ठीक से संबोधित नहीं किया जाता है, इसलिए जिस दिन डेलाइट सेविंग टाइम समाप्त होता है उसके लिए दिनांक / समय का मान 25 घंटे होता है और इसे इस प्रकार दर्शाया जाता है:

2019102700
2019102701
...
2019102724

मैं उन कोड को एक DateTimeऑब्जेक्ट में बदलने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं जो मैं एक पंडों के डेटाफ्रेम के सूचकांक के रूप में उपयोग करता हूं:

df.index = pd.to_datetime(df["date_time"], format="%Y%m%d%H")

हालाँकि, यह एक त्रुटि देता है:

ValueError: unconverted data remains: 4

संभवत: क्योंकि to_datetimeफ़ंक्शन को घंटे होने की उम्मीद नहीं है 24। इसी तरह, जिस दिन में डेलाइट सेविंग टाइम शुरू होता है वह केवल 23 घंटे का होता है।

मैंने सोचा था कि एक समाधान तारीखों को तार के रूप में संग्रहीत कर रहा था, लेकिन यह न तो सुरुचिपूर्ण और न ही कुशल लगता है। क्या उपयोग करते समय डेलाइट बचत समय को संभालने के मुद्दे को हल करने का कोई तरीका है to_datetime?

जवाब

1 MrFuppes Aug 16 2020 at 18:40

यदि आप टाइमजोन को जानते हैं, तो यहां UTC टाइमस्टैम्प की गणना करने का एक तरीका है। केवल दिनांक भाग को पार्स करें, वास्तविक समय क्षेत्र के डेटा को "यूटी" के लिए स्थानीय करें और उसे यूटीसी में परिवर्तित करें। अब आप घंटे के हिस्से को पार्स कर सकते हैं और इसे समय डेल्टा के रूप में जोड़ सकते हैं - जैसे

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

मुझे यकीन नहीं है कि यह सबसे सुंदर या कुशल समाधान है, लेकिन मैं करूंगा:

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