如何在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
相关产品推荐
相关产品推荐

