Python 3.x Python熊猫:支持25小时的datetime索引

Python 3.x Python熊猫:支持25小时的datetime索引,python-3.x,pandas,dataframe,datetime,Python 3.x,Pandas,Dataframe,Datetime,我想使用日期/时间作为Pandas中数据帧的索引 但是,夏令时未在数据库中正确寻址,因此夏令时结束当天的日期/时间值为25小时,并表示为: 2019102700 2019102701 ... 2019102724 我使用以下代码将这些值转换为DateTime对象,用作数据帧的索引: df.index = pd.to_datetime(df["date_time"], format="%Y%m%d%H") 但是,这会产生一个错误: ValueError:

我想使用日期/时间作为Pandas中数据帧的索引

但是,夏令时未在数据库中正确寻址,因此夏令时结束当天的日期/时间值为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小时


我想到的一个解决方案是将日期存储为字符串,但这似乎既不优雅也不高效。使用
到_datetime
时,有没有办法解决夏令时的处理问题?

我不确定这是不是最优雅或最有效的解决方案,但我会:

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

我不确定这是否是最优雅或最有效的解决方案,但我会:

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

如果您知道时区,这里有一种计算UTC时间戳的方法。仅解析日期部分,将数据定位到“所属”的实际时区,并将其转换为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]

如果您知道时区,这里有一种计算UTC时间戳的方法。仅解析日期部分,将数据定位到“所属”的实际时区,并将其转换为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]

选择第一个和最后一个索引,将它们转换为支持tz_的datetime,然后您可以生成一个处理25小时工作日的date_范围。并将日期范围指定给df索引:

start = pd.to_datetime(df.index[0]).tz_localize("Europe/Berlin")
end = pd.to_datetime(df.index[-1]).tz_localize("Europe/Berlin")
index_ = pd.date_range(start, end, freq="15min")
df = df.set_index(index_)

选择第一个和最后一个索引,将它们转换为支持tz_的datetime,然后您可以生成一个处理25小时工作日的date_范围。并将日期范围指定给df索引:

start = pd.to_datetime(df.index[0]).tz_localize("Europe/Berlin")
end = pd.to_datetime(df.index[-1]).tz_localize("Europe/Berlin")
index_ = pd.date_range(start, end, freq="15min")
df = df.set_index(index_)

试着用df['date']=df.index.to_series().str.slice(stop=-2)和倒数的
.slice(start=-2)
计算时间,然后用日历计算夏令时的时间。你知道时区吗?间隔是否像你的例子(1h)中那样有规律?@MrFuppes是的,我知道
df['date']=df.index.to_series().str.slice(stop=-2)
,倒数
.slice(start=-2)
表示时间,然后用日历计算夏令时的时间。你知道时区吗?间隔是否与你的示例(1h)一样规则?@MrFuppes是的,我更喜欢MrFuppes的解决方案,但谢谢你的回答,这也很有效!名字也不错:)我更喜欢Fuppes先生的解决方案,但谢谢你的回答,那也行!名字也不错:)