如何为多日不规则秒级时间戳DataFrame生成按日重置的分钟桶计数器
问题
我有一个包含跨多日不规则秒级时间戳的DataFrame,希望新增一列将数据按分钟分桶,同时生成一个单独的递增计数器列:同一分钟内的所有数据对应相同的计数器值,计数器随每日分钟数递增,次日从1重新开始。
示例数据如下:
Value Counter 2020-01-01 10:00:00 7. 1 2020-01-01 10:00:05 45. 1 2020-01-01 10:00:10 25. 1 2020-01-01 10:02:00 85. 2 2020-01-02 07:00:00 51. 1 2020-01-02 10:00:00 52. 2
我尝试了以下代码,但无法正常工作:
df['Counter'] = df.groupby([df.index.dt.day, df.index.dt.minute]).count()
解决方案
你的问题出在分组逻辑和赋值方式上:groupby([day, minute])会把不同日期但分钟数相同的行归为一组,而且count()返回的是分组后的统计结果,无法直接赋值回原DataFrame。
正确的思路是先按日期+分钟分组(确保同一天的同一分钟为一组),然后对每个日期内的分组按时间顺序分配递增的计数器。以下是两种可行的实现方法:
方法一:groupby + factorize
# 生成分钟分桶键:将秒级时间戳向下取整到分钟 df['minute_bucket'] = df.index.floor('T') # 按自然日分组,对每个日期内的分钟分桶进行编码,相同分桶对应相同序号(从1开始) df['Counter'] = df.groupby(df.index.dt.date)['minute_bucket'].transform(lambda x: x.factorize()[0] + 1)
方法二:groupby + rank
# 生成分钟分桶键 df['minute_bucket'] = df.index.floor('T') # 按自然日分组,对分钟分桶按时间顺序生成连续排名 df['Counter'] = df.groupby(df.index.dt.date)['minute_bucket'].rank(method='dense', ascending=True).astype(int)
收尾处理
如果不需要保留临时的分桶列,可以执行删除:
df.drop('minute_bucket', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者ThatQuantDude
相关产品推荐
相关产品推荐

