我有一个pandas
dataframe
,具有Start
和End
数据时间。
df=pd.DataFrame(data=pd.date_range('20100201', periods=10, freq='5h3min'),columns=['Start'])
df.loc[:,'End']=df.loc[:,'Start']+pd.Timedelta(4,'h')
可以预期
Start
和End
在内部进行排序,但是连续的行之间可能会出现间隙/重叠。我想创建一个新的数据框,区别在于如果行包含午夜(例如[
Start
,End
]中包含午夜),则在午夜前后将行分为两部分例如:
Start End
0 2010-02-01 00:00:00 2010-02-01 04:00:00
1 2010-02-01 05:03:00 2010-02-01 09:03:00
2 2010-02-01 10:06:00 2010-02-01 14:06:00
3 2010-02-01 15:09:00 2010-02-01 19:09:00
4 2010-02-01 20:12:00 2010-02-02 00:12:00
5 2010-02-02 01:15:00 2010-02-02 05:15:00
应该
Start End
0 2010-02-01 00:00:00 2010-02-01 04:00:00
1 2010-02-01 05:03:00 2010-02-01 09:03:00
2 2010-02-01 10:06:00 2010-02-01 14:06:00
3 2010-02-01 15:09:00 2010-02-01 19:09:00
-----------------------------------------
4 2010-02-01 20:12:00 2010-02-01 23:59:00
5 2010-02-02 00:00:00 2010-02-02 00:12:00
-----------------------------------------
6 2010-02-02 01:15:00 2010-02-02 05:15:00
最佳答案
您可以合并新对的DataFrame,然后擦除旧对。
首先找到拆分:
splits = df[df.End.dt.date > df.Start.dt.date].copy()
现在连接并删除:
>>> pd.concat([
df,
pd.DataFrame({
'Start': list(splits.Start) + list(splits.End.dt.floor(freq='1D')),
'End': list(splits.Start.dt.ceil(freq='1D')) + list(splits.End)})
]).drop(splits.index).sort_values(by='Start')
End Start
0 2010-02-01 04:00:00 2010-02-01 00:00:00
1 2010-02-01 09:03:00 2010-02-01 05:03:00
2 2010-02-01 14:06:00 2010-02-01 10:06:00
3 2010-02-01 19:09:00 2010-02-01 15:09:00
0 2010-02-02 00:00:00 2010-02-01 20:12:00
2 2010-02-02 00:12:00 2010-02-02 00:00:00
5 2010-02-02 05:15:00 2010-02-02 01:15:00
6 2010-02-02 10:18:00 2010-02-02 06:18:00
7 2010-02-02 15:21:00 2010-02-02 11:21:00
8 2010-02-02 20:24:00 2010-02-02 16:24:00
1 2010-02-03 00:00:00 2010-02-02 21:27:00
3 2010-02-03 01:27:00 2010-02-03 00:00:00
关于python - 在午夜拆分数据帧条目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50336251/