问题描述
Date
31/8/20 4:56:00
31/8/20 4:45:00
31/8/20 4:39:00
31/8/20 4:36:00
31/8/20 4:34:00
31/8/20 4:05:00
31/8/20 4:04:00
31/8/20 3:19:00
31/8/20 2:54:00
我希望它以15分钟为单位对行进行分组,并在每行都属于15分钟日期时间类别时对其进行标记。所以我希望我的输出看起来像这样:
Date Interval
31/8/20 4:56:00 Period 1
31/8/20 4:45:00 Period 1
31/8/20 4:39:00 Period 2
31/8/20 4:36:00 Period 2
31/8/20 4:34:00 Period 2
31/8/20 4:05:00 Period 4
31/8/20 4:04:00 Period 4
31/8/20 3:19:00 Period 7
31/8/20 2:54:00 Period 9
如您所见,“期间1”包含31/8/20 4:45-31/8/20 4:59:00之间的所有日期时间。如果该期间没有相应的行条目,则应出现期间间隔。这就是为什么“时段4”不是“时段3”
我尝试了以下操作:
df = pd.DataFrame()
df = df.sort_values(by=['Date'],ascending=False)
df['Date'] = pd.to_datetime(df['Date'])
df['Interval'] = 'Period ' + (((df.shift()['Date'] - df['Date']).dt.seconds > 900).cumsum() + 1).astype(str)
但是,如果日期时间行在上一个日期时间行的15分钟之内,则会在“时间间隔”列中返回“时段n”。
Date Interval
31/8/20 4:56:00 Period 1
31/8/20 4:45:00 Period 2
31/8/20 4:39:00 Period 3
31/8/20 4:36:00 Period 4
31/8/20 4:34:00 Period 5
31/8/20 4:05:00 Period 6
31/8/20 4:04:00 Period 7
31/8/20 3:19:00 Period 8
31/8/20 2:54:00 Period 9
相反,我想给每行加上一个“句点”,而不用考虑前几行的日期时间,并基于一小时内的四个15分钟间隔,从而根据
- dd / mm / yy h:45:00-h:59:59,
- dd / mm / yy h:30:00-h:44:59,
- dd / mm / yy h:15:00-h:29:59,
- dd / mm / yy h:00:00-h:14:59
谢谢。
解决方法
在Grouper
上以15min
的频率使用DataFrame.groupby
,然后将groupby.ngroup
与可选参数ascending=False
一起使用以对每个组进行编号:
s = df.groupby(pd.Grouper(freq='15min',key='Date')).ngroup(ascending=False).add(1)
df['Interval'] = 'Period ' + s.astype(str)
结果:
Date Interval
0 2020-08-31 04:56:00 Period 1
1 2020-08-31 04:45:00 Period 1
2 2020-08-31 04:39:00 Period 2
3 2020-08-31 04:36:00 Period 2
4 2020-08-31 04:34:00 Period 2
5 2020-08-31 04:05:00 Period 4
6 2020-08-31 04:04:00 Period 4
7 2020-08-31 03:19:00 Period 7
8 2020-08-31 02:54:00 Period 9