Python Pandas: datetime endeksinde 25 saati destekler

Aug 16 2020

Pandas'taki bir veri çerçevesi için dizin olarak bir tarih / saat kullanmak istiyorum.

Ancak, gün ışığından yararlanma saati veritabanında doğru bir şekilde ele alınmadığından, gün ışığından yararlanma saatinin bittiği günün tarih / saat değerleri 25 saate sahiptir ve şu şekilde temsil edilir:

2019102700
2019102701
...
2019102724

Bu değerleri DateTimePandas veri çerçevesine dizin olarak kullandığım bir nesneye dönüştürmek için aşağıdaki kodu kullanıyorum :

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

Ancak bu bir hata verir:

ValueError: unconverted data remains: 4

Muhtemelen to_datetimeişlevin saatin olmasını beklemediği için 24. Benzer şekilde, gün ışığından yararlanma saatinin başladığı günün yalnızca 23 saati vardır.

Düşündüğüm bir çözüm, tarihleri ​​dizeler olarak saklamaktı, ancak bu ne zarif ne de verimli görünüyor. Kullanırken yaz saati uygulaması sorununu çözmenin herhangi bir yolu var mı to_datetime?

Yanıtlar

1 MrFuppes Aug 16 2020 at 18:40

Saat dilimini biliyorsanız, UTC zaman damgalarını hesaplamanın bir yolu aşağıda verilmiştir. Yalnızca tarih bölümünü ayrıştırın, verilerin "ait olduğu" gerçek saat dilimine göre yerelleştirin ve bunu UTC'ye dönüştürün. Artık saat bölümünü ayrıştırabilir ve bunu bir zaman deltası olarak ekleyebilirsiniz - örn.

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

Bunun en şık mı yoksa etkili bir çözüm mü olduğundan emin değilim, ama şunu yapardım:

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