由hou上的开始和结束时间戳定义的拆分持续时间

2024-05-18 18:22:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个开始和结束时间戳的数据帧,如下所示:

              Start               End
0  2019-01-01 00:59  2019-01-01 01:01
1  2019-01-01 01:10  2019-01-01 03:10

我想按小时划分时段(也就是说,如果时段从18:59开始到19:05结束,我们将有两个新行,一个从18:59开始到19:00结束,另一个从19:00开始到19:05结束)。我的示例数据帧的输出是:

              Start               End
0  2019-01-01 00:59  2019-01-01 01:00
1  2019-01-01 01:00  2019-01-01 01:01
2  2019-01-01 01:10  2019-01-01 02:00
3  2019-01-01 02:00  2019-01-01 03:00
4  2019-01-01 03:00  2019-01-01 03:10

我已经尝试了一些使用dt.ceil和dt.floor方法的方法来确定是否需要中断一行,但是如果不逐行循环,我无法找到一种平滑的方法来完成整个转换

可以使用以下代码段生成数据帧:

start = pd.DataFrame({
    'Start': ['2019-01-01 00:59', '2019-01-01 01:10'],
    'End': ['2019-01-01 01:01', '2019-01-01 03:10']
})

finish = pd.DataFrame({
    'Start': ['2019-01-01 00:59', '2019-01-01 01:00', '2019-01-01 01:10', '2019-01-01 02:00', '2019-01-01 03:00'],
    'End': ['2019-01-01 01:00', '2019-01-01 01:01', '2019-01-01 02:00', '2019-01-01 03:00', '2019-01-01 03:10']
})

Tags: 数据方法示例dataframe代码段时间dtstart
1条回答
网友
1楼 · 发布于 2024-05-18 18:22:17

使用listcomp,pd.date_range并从date_range的结果构造序列s。最后,从s构造最终的df

a = [pd.date_range(s.ceil('H'), e, freq='H').insert(0,s) for s, e in zip(df.Start, df.End)]
s = pd.Series(a, index=df.index).explode()

df_final = (pd.DataFrame({'Start': s, 'End': s.groupby(level=0).shift(-1).fillna(df.End)})
              .reset_index(drop=True))

Out[41]:
                Start                 End
0 2019-01-01 00:59:00 2019-01-01 01:00:00
1 2019-01-01 01:00:00 2019-01-01 01:01:00
2 2019-01-01 01:10:00 2019-01-01 02:00:00
3 2019-01-01 02:00:00 2019-01-01 03:00:00
4 2019-01-01 03:00:00 2019-01-01 03:10:00

如果希望输出StartEnd为字符串格式,只需添加strftime

df_final = pd.DataFrame({'Start': s.dt.strftime('%Y-%m-%d %H:%M'), 
                         'End': s.groupby(level=0).shift(-1).fillna(df.End).dt.strftime('%Y-%m-%d %H:%M')})

Out[40]:
              Start               End
0  2019-01-01 00:59  2019-01-01 01:00
0  2019-01-01 01:00  2019-01-01 01:01
1  2019-01-01 01:10  2019-01-01 02:00
1  2019-01-01 02:00  2019-01-01 03:00
1  2019-01-01 03:00  2019-01-01 03:10

注意:如果您的pandas版本不支持explode,您可以使用df.index.repeatnp.concatenate来创建s

s = pd.Series(np.concatenate(a), index=df.index.repeat(list(map(len, a))))

相关问题 更多 >

    热门问题