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

