按在 Pandas 中开始和结束的日期范围展开行

Ale*_*and 5 python datetime date pandas

我正在处理一个数据集,其中包含有关在某些时间范围内发生的现象的信息。我得到了事件的开始和结束时间及其严重性,以及一些其他信息。我想通过在设定的时间段内扩展行并将其余信息保留为 NaN 来在更大的时间段内扩展这些帧。

数据集示例:

                         date_end         severity   category
     date_start           
2018-01-04 07:00:00  2018-01-04 10:00:00     12          1
2018-01-04 12:00:00  2018-01-04 13:00:00     44          2
Run Code Online (Sandbox Code Playgroud)

我想要的是:

                     severity   category
     date_start           
2018-01-04 07:00:00     12         1
2018-01-04 08:00:00     12         1
2018-01-04 09:00:00     12         1
2018-01-04 10:00:00     12         1
2018-01-04 11:00:00     nan       nan
2018-01-04 12:00:00     44         2
2018-01-04 13:00:00     44         2
2018-01-04 14:00:00     nan       nan
2018-01-04 15:00:00     nan       nan
Run Code Online (Sandbox Code Playgroud)

实现这种结果的有效方法是什么?

Cod*_*ent 9

假设您使用的是 pandas v0.25,请使用explode

df['hour'] = df.apply(lambda row: pd.date_range(row.name, row['date_end'], freq='H'), axis=1)
df = df.explode('hour').reset_index() \
        .drop(columns=['date_start', 'date_end']) \
        .rename(columns={'hour': 'date_start'}) \
        .set_index('date_start')
Run Code Online (Sandbox Code Playgroud)

对于带有 的行nan,您可以重新索引您的数据框。

# Report from Jan 4 - 5, 2018, from 7AM - 7PM
days = pd.date_range('2018-01-04', '2018-01-05')
hours = pd.to_timedelta(range(7, 20), unit='h')
tmp = pd.MultiIndex.from_product([days, hours], names=['Date', 'Hour']).to_frame()

s = tmp['Date'] + tmp['Hour']
df.reindex(s)
Run Code Online (Sandbox Code Playgroud)