gpt4 book ai didi

python - 由开始和结束时间戳定义的分割持续时间

转载 作者:行者123 更新时间:2023-12-01 00:25:40 24 4
gpt4 key购买 nike

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

              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']
})

最佳答案

使用listcomp,pd.date_range并构建系列s来自 date_range 的结果。最后,构建最终df来自s

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

关于python - 由开始和结束时间戳定义的分割持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58599482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com