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

如何用Pandas标记DataFrame中日期序列的周期信息?

解决DataFrame日期周期标记问题

步骤说明

要实现需求,核心是先将日期转为可计算格式,再把连续(含重复)日期归为同一组,最后针对每组的位置标记对应的Notes。

完整代码实现

import pandas as pd

# 1. 创建原始DataFrame
data = {
    'Class': [1,2,3,4,5,6,7],
    'Dates': ['2022.01.12', '2022.01.13', '2022.01.15', '2022.01.20', '2022.01.21', '2022.01.22', '2022.01.22']
}
df = pd.DataFrame(data)

# 2. 将日期字符串转为datetime格式,方便计算日期差
df['Dates'] = pd.to_datetime(df['Dates'], format='%Y.%m.%d')

# 3. 生成分组标识:判断当前日期与前一个是否连续(差≤1天),非连续则开启新组
df['is_new_group'] = df['Dates'].diff().fillna(pd.Timedelta(days=2)) > pd.Timedelta(days=1)
df['group_id'] = df['is_new_group'].cumsum()

# 4. 针对每个分组添加Notes标记
def add_notes(group):
    group_len = len(group)
    if group_len == 1:
        # 单日期组标记为Singledate
        group['Notes'] = 'Singledate'
    else:
        # 多日期组:首尾分别标记Min/Max,中间留空
        group['Notes'] = ''
        group.loc[group.index[0], 'Notes'] = 'Min'
        group.loc[group.index[-1], 'Notes'] = 'Max'
    return group

df = df.groupby('group_id').apply(add_notes)

# 5. 清理辅助列,得到最终结果
df = df.drop(['is_new_group', 'group_id'], axis=1)
print(df)

代码说明

  1. 日期格式转换:必须先把字符串日期转成datetime类型,才能正确计算日期间隔。
  2. 分组逻辑:通过diff()计算当前日期与前一日的差值,若差值超过1天,则判定为新组,用cumsum()生成唯一分组ID。
  3. 标记规则实现:
    • 单元素分组:直接标记Singledate
    • 多元素分组:先把所有元素设为空,再给组内第一个元素标Min,最后一个元素标Max(包含重复日期的情况)

原代码问题分析

  • 语法错误:df['Dates]:缺少右引号、'min缺少右引号、elif无判断条件
  • 逻辑错误:直接对整列赋值df['Notes']='min',没有针对单行操作;未将日期转为可计算格式,diff()无法正确计算日期差;没有按连续日期分组,无法准确标记首尾。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:10:48