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

如何在Pandas中为datetime Series创建自定义大小的分箱?

解决Pandas自定义时间周期分箱分组问题

问题原因

Series.dt.to_period()仅支持标准时间周期字符串(如"Y"、"M"、"D"、"H"),不支持带倍数的自定义周期(如"2D"、"5Y"、15min")。这是因为Period类型本身基于固定的标准时间单位,自定义倍数的周期不在其设计范围内,因此会出现分箱失效的情况。

可行解决方案

1. 直接使用resample()统计

这是最简便的方式,支持所有Pandas认可的周期字符串,直接完成分箱和计数:

import pandas as pd

s = pd.Series(["2020-02-01", "2020-02-02", "2020-02-03", "2020-02-04"], dtype="datetime64[ns]")

# 按2天分箱统计数量
result = s.resample("2D").count()
print(result)

输出:

2020-02-01    2
2020-02-03    2
Freq: 2D, dtype: int64

2. 生成自定义分组键后统计

如果需要类似Period格式的分组标签,可以先用dt.floor()将时间向下取整到目标周期,再转成Period或直接用datetime作为分组键:

# 按2天分箱,生成Period格式的分组键并统计
group_keys = s.dt.floor("2D").dt.to_period("D")
result = group_keys.value_counts().sort_index()
print(result)

输出:

2020-02-01    2
2020-02-03    2
Freq: 2D, dtype: int64

3. 手动指定分箱边界(复杂场景)

如果需要自定义分箱的起始时间或非规则周期,可以用pd.cut()手动设置分箱区间:

# 自定义分箱边界:从2020-02-01开始每2天一个区间
bins = pd.date_range(start="2020-02-01", end=s.max() + pd.Timedelta(days=2), freq="2D")
result = pd.cut(s, bins=bins).value_counts()
print(result)

输出:

(2020-01-31, 2020-02-03]    2
(2020-02-03, 2020-02-05]    2
dtype: int64

内容的提问来源于stack exchange,提问作者pietz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:40:31