Python 按日期范围展开行,开始和结束在

Python 按日期范围展开行,开始和结束在,python,pandas,date,datetime,Python,Pandas,Date,Datetime,我正在使用一个数据集,其中包含一些时间段内发生的现象的信息。我得到了事件的开始和结束时间及其严重性,以及一些其他信息。我想在更大的时间段内扩展这些帧,方法是在设置的时间段内扩展行,并将其余信息保留为NaN 数据集示例: date_end severity category date_start 2018-01-04 07:00:00 2018-01-04 10:00:00 12

我正在使用一个数据集,其中包含一些时间段内发生的现象的信息。我得到了事件的开始和结束时间及其严重性,以及一些其他信息。我想在更大的时间段内扩展这些帧,方法是在设置的时间段内扩展行,并将其余信息保留为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
我想要的是:

                     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

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

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

对于
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)

一种方法是使用pd.date\u range重新索引datafame,使用ffill并屏蔽索引大于date\u end的值

df.index = pd.to_datetime(df.index)

df['date_end'] = pd.to_datetime(df['date_end'])

df1 = df.reindex(pd.date_range(df.index.min(), '2018-01-04 15:00:00', freq='H'))

df1 = df1.ffill()

df1.loc[(df1.index - df1['date_end']) > pd.Timedelta(days=0)] = np.nan

df_out = df1.drop('date_end', axis=1)

print(df_out)
输出:

                     severity  category
2018-01-04 07:00:00      12.0       1.0
2018-01-04 08:00:00      12.0       1.0
2018-01-04 09:00:00      12.0       1.0
2018-01-04 10:00:00      12.0       1.0
2018-01-04 11:00:00       NaN       NaN
2018-01-04 12:00:00      44.0       2.0
2018-01-04 13:00:00      44.0       2.0
2018-01-04 14:00:00       NaN       NaN
2018-01-04 15:00:00       NaN       NaN

您是如何确定日期开始范围的结束时间的?它可能是任意的,可以作为:
datetime.datetime.now()
第一行的结束日期是否应该是预期输出的10:00而不是7:00?第二行的起始日期应该是2018-01-04,而不是2018-01-05?是的,很好,我在格式上犯了一个错误,第二行的起始日期是
2018-01-04 12:00:00
而不是
2018-01-05 12:00:00
关于重新编制索引的问题我使用了:
date\u range=pd.date\u range(start=date\u start,end=date\u end,freq='H')df.reindex(date\u range,fill\u value=np.NaN)
在将date\u start设置为date\u start的最小值,date\u end设置为任意值之前,您认为哪个解决方案更有效?您的解决方案在一天的所有24小时内都会报告。我的答案仅在上午7点到下午7点之间报告。两者都工作正常,但用途略有不同。感谢您的澄清!对于格式设置,我很抱歉,我是直到想弄明白为止
                     severity  category
2018-01-04 07:00:00      12.0       1.0
2018-01-04 08:00:00      12.0       1.0
2018-01-04 09:00:00      12.0       1.0
2018-01-04 10:00:00      12.0       1.0
2018-01-04 11:00:00       NaN       NaN
2018-01-04 12:00:00      44.0       2.0
2018-01-04 13:00:00      44.0       2.0
2018-01-04 14:00:00       NaN       NaN
2018-01-04 15:00:00       NaN       NaN