Python Pandas: datetime endeksinde 25 saati destekler
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 DateTime
Pandas 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_datetime
iş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
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]
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")