You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为多日不规则秒级时间戳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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:05:24