如何自动将Datetime数据按近似均等时长划分成不重叠分组?
自动按时间区间分组DataFrame数据
需求说明
已有包含datetime类型date字段的DataFrame,数据时间跨度84个月,需划分为4组:
- 每组约含21个月数据
- 以数据最早日期(2015-10-02)为起点,各组区间无重叠(后一组起始为前一组结束日期+1天)
- 最后一组截止到数据最晚日期(2022-09-30)
- 替代手动编写
np.select的低效方式,实现自动生成分组区间并完成分组
解决方案
方法1:自动生成区间后用np.select分组
通过计算每组的起始/结束日期,自动生成条件列表和分组标签,无需手动输入日期:
import pandas as pd import numpy as np # 确保date字段为datetime类型(若未预处理) df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d") # 获取数据首尾日期 min_date = df["date"].min() max_date = df["date"].max() # 定义分组参数 months_per_group = 21 num_groups = 4 # 自动生成各组起始日期 group_starts = [min_date + pd.DateOffset(months=i * months_per_group) for i in range(num_groups)] # 自动生成各组结束日期(前3组为下一组起始-1天,最后一组到数据最晚日期) group_ends = [] for i in range(num_groups - 1): group_ends.append(group_starts[i+1] - pd.Timedelta(days=1)) group_ends.append(max_date) # 生成分组条件与标签 condlist = [(df["date"] >= start) & (df["date"] <= end) for start, end in zip(group_starts, group_ends)] choicelist = [chr(ord('A') + i) for i in range(num_groups)] # 为数据添加分组列 df["Group"] = np.select(condlist, choicelist)
方法2:用pd.cut快速分组
利用pd.cut的区间划分特性,结合调整后的边界实现分组,代码更简洁:
import pandas as pd # 确保date字段为datetime类型 df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d") min_date = df["date"].min() max_date = df["date"].max() months_per_group = 21 num_groups = 4 # 生成区间边界:最后一个边界设为最晚日期+1天,确保包含所有数据 group_starts = pd.date_range(start=min_date, periods=num_groups, freq=f"{months_per_group}MS") bins = [min_date] + list(group_starts[1:]) + [max_date + pd.Timedelta(days=1)] labels = ["A", "B", "C", "D"] # 执行分组,include_lowest=True确保包含最早日期 df["Group"] = pd.cut(df["date"], bins=bins, labels=labels, include_lowest=True)
验证分组结果
可通过以下代码验证每组的时间范围和数据量:
# 查看每组的时间区间 group_ranges = df.groupby("Group")["date"].agg(["min", "max"]) print(group_ranges) # 查看每组的数据量 group_counts = df["Group"].value_counts().sort_index() print(group_counts)
内容的提问来源于stack exchange,提问作者JoMcGee
相关产品推荐
相关产品推荐

