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

如何在Pandas DataFrame中按工单时长区间分组分类

实现方法及报错解决方案

一、完整实现步骤

1. 确保创建时间列是datetime类型

首先要将Created Time列转换为Pandas的datetime格式,这是后续计算时间差的基础,也是避免类型错误的关键:

import pandas as pd

# 转换列类型,errors='coerce'将无效时间转为NaT(缺失时间值)
df['Created Time'] = pd.to_datetime(df['Created Time'], errors='coerce')

2. 计算工单年龄(天数)

以当前时间为基准,计算工单从创建到现在的天数差:

# 计算时间差
df['Time Delta'] = pd.Timestamp.now() - df['Created Time']
# 转换为天数(整数)
df['Age Days'] = df['Time Delta'].dt.days

如果需要以特定时间(而非当前时间)为基准,替换pd.Timestamp.now()为目标时间即可,比如pd.to_datetime('2024-06-01')。

3. 按区间分类工单年龄

有两种常用方法实现分类:

方法1:使用pd.cut(高效批量处理)

定义区间边界和对应标签,直接批量生成分类:

# 定义区间边界(左闭右开,对应标签范围)
bins = [0, 16, 31, 91, 181, 366, float('inf')]
# 定义对应标签
labels = ['1-15 Days', '16-30 Days', '1-3 Months', '3-6 Months', '6 Months-1Yr', 'More than 1Yr']

# 生成分类列
df['Ticket Age Category'] = pd.cut(
    df['Age Days'],
    bins=bins,
    labels=labels,
    right=False,  # 设置左闭右开,确保区间匹配标签
    include_lowest=True
)

方法2:自定义函数+apply(灵活处理特殊情况)

如果需要更精细的逻辑控制,比如处理缺失值或特殊天数,可使用自定义函数:

def categorize_ticket_age(days):
    if pd.isna(days):
        return 'Invalid Created Time'
    elif 1 <= days <= 15:
        return '1-15 Days'
    elif 16 <= days <= 30:
        return '16-30 Days'
    elif 31 <= days <= 90:
        return '1-3 Months'
    elif 91 <= days <= 180:
        return '3-6 Months'
    elif 181 <= days <= 365:
        return '6 Months-1Yr'
    else:
        return 'More than 1Yr'

# 应用函数生成分类列
df['Ticket Age Category'] = df['Age Days'].apply(categorize_ticket_age)

二、常见报错及解决方案

1. TypeError: unsupported operand type(s) for -: 'Timestamp' and 'str'

  • 原因:Created Time列是字符串类型,无法和Timestamp做减法运算。
  • 解决方案:执行步骤1中的pd.to_datetime转换,确保列类型为datetime。

2. ValueError: bins must increase monotonically

  • 原因:定义的bins列表不是从小到大递增的顺序。
  • 解决方案:检查bins的数值顺序,确保从最小到最大排列,比如[0,16,31,...]而非[16,0,...]。

3. SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

  • 原因:当前操作的DataFrame是原DataFrame的切片副本,直接赋值会触发警告。
  • 解决方案:在操作前创建DataFrame的副本:
df = df.copy()

或者使用.loc进行赋值:

df.loc[:, 'Ticket Age Category'] = pd.cut(...)

4. NaN/NaT导致分类结果缺失

  • 原因:Created Time存在无效时间(转为NaT),计算出的Age Days为NaN,无法参与分类。
  • 解决方案:
    • 过滤无效行:df = df.dropna(subset=['Created Time'])
    • 为缺失值指定专属标签:如方法2中返回'Invalid Created Time'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:11:24