如何比较pandas dataframe时间列值与自定义时间并划分昼夜类别
报错原因
- 运算符优先级问题:
&位运算符优先级高于比较运算符,你写的column > stringday & column > stringnight会优先计算stringday & column,类型不匹配直接抛出错误,即使类型兼容逻辑也不符合预期。 - 判断逻辑错误:你的需求是时间介于6:30到18:30之间标记为Day,原代码的判断条件写反了,且缺少括号包裹比较逻辑。
- 函数调用方式错误:你直接将整个Series列传入自定义标量处理函数,普通
if判断无法直接处理向量序列,需要逐行处理或者改用向量化操作。 - 列类型问题:大概率
df['Time']仍为字符串类型,未转换为时间类型,无法直接和time对象做大小比较。
最优实现方案
推荐直接用pandas向量化操作实现,性能远高于逐行apply,代码简洁易维护:
import pandas as pd import numpy as np from datetime import time # 1. 先将时间字符串列转换为time类型 df['Time'] = pd.to_datetime(df['Time']).dt.time # 2. 定义日夜分界点 day_start = time(6, 30, 0) day_end = time(18, 30, 0) # 3. 向量化判断生成标签 df['Day_Night'] = np.where( (df['Time'] >= day_start) & (df['Time'] <= day_end), 'Day', 'Night' )
原代码修正方案(不推荐,仅做参考)
如果你坚持用自定义函数实现,需要通过apply逐行调用,同时修正逻辑和运算符问题:
from datetime import datetime def datetimeToDayNight(time_val, daytime='06:30:00', nighttime='18:30:00'): """Convert datetime to string 'Day' or 'Night'.""" stringday= datetime.strptime(daytime, '%H:%M:%S').time() stringnight = datetime.strptime(nighttime, '%H:%M:%S').time() # 加括号包裹比较逻辑,修正判断条件 if (time_val >= stringday) and (time_val <= stringnight): return 'Day' else: return 'Night' df['Day_Night']= df['Time'].apply(datetimeToDayNight)
内容的提问来源于stack exchange,提问作者yellowcrayon
相关产品推荐
相关产品推荐

