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

Python中按时间条件给DataFrame的category列赋值报错如何解决

错误原因

time列存储的是datetime.time类型对象,无法直接和整数做大小比较,必须和同类型的datetime.time实例进行比较。同时你当前的自定义函数只覆盖了单条规则,其他场景没有返回值,会导致Category列出现空值。

方案1:自定义函数逐行处理(小数据量适用)

import datetime

def assign_category(row):
    # 注意列名大小写和你实际数据表保持一致,示例中列名为小写time
    current_time = row["time"]
    if datetime.time(0, 0) < current_time < datetime.time(6, 0):
        return "b"
    elif datetime.time(6, 0) <= current_time < datetime.time(20, 0):
        return "i"
    elif datetime.time(20, 0) <= current_time < datetime.time(22, 0):
        return "p"
    # 覆盖剩余22:00到24:00的场景
    else:
        return "i"

df["Category"] = df.apply(assign_category, axis=1)

方案2:向量化分箱处理(大数据量适用,性能远高于逐行apply)

import pandas as pd
import datetime

# 若time列为字符串格式,可先执行转换为datetime.time类型:
# df["time"] = pd.to_datetime(df["time"]).dt.time

# 定义时间区间边界、对应标签,左闭右开匹配你的规则
time_bins = [
    datetime.time(0, 0),
    datetime.time(6, 0),
    datetime.time(20, 0),
    datetime.time(22, 0),
    datetime.time(23, 59, 59)
]
category_labels = ["b", "i", "p", "i"]

df["Category"] = pd.cut(
    df["time"],
    bins=time_bins,
    labels=category_labels,
    right=False,
    include_lowest=True
)
# 修正00:00的归属:你的规则要求00:00<time才归为b,所以00:00调整为i
df.loc[df["time"] == datetime.time(0, 0), "Category"] = "i"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:06:03