Pandas按条件修改DataFrame时间值 解决.dt访问器报错问题
报错原因
- 你创建的
time列初始是字符串类型,并非pandas支持的日期时间类类型,.dt访问器仅能对datetime、timedelta、Period这类时间类型的列使用,直接对字符串列调用就会触发该报错。 - 你写的
np.where语法不完整,该函数需要传入3个参数:判断条件、条件成立时的返回值、条件不成立时的返回值,你只传了前2个参数,即便解决了类型问题代码也无法正常运行。
正确实现代码
import pandas as pd import numpy as np # 原始数据 data = {'time':['08:45:00', '09:30:00', '18:00:00', '15:00:00']} df = pd.DataFrame(data) # 第一步:将字符串格式的时间列转为datetime类型,解锁.dt访问器 df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S') # 第二步:按规则调整时间,小于9点设为9点整,大于17点设为17点整,其余时间保持不变 df['time'] = np.where( df['time'].dt.hour < 9, pd.Timestamp("09:00:00").time(), np.where( df['time'].dt.hour > 17, pd.Timestamp("17:00:00").time(), df['time'].dt.time ) )
运行后得到的结果如下,完全符合需求:
| time | |
|---|---|
| 0 | 09:00:00 |
| 1 | 09:30:00 |
| 2 | 17:00:00 |
| 3 | 15:00:00 |
如果你不需要把超出范围的时间取整到整点,仅修改小时值、保留原有分钟和秒数,只需要把替换值改为对应原时间替换小时后的结果即可。
可选简洁写法
可以直接用clip方法把小时值裁剪到9-17的区间,不需要嵌套np.where:
df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S') # 把小时值限制在[9,17]范围 adjusted_hour = df['time'].dt.hour.clip(lower=9, upper=17) # 替换小时生成最终时间 df['time'] = df['time'].apply( lambda x: x.replace(hour=adjusted_hour.loc[x.name], minute=0, second=0).time() )
内容的提问来源于stack exchange,提问作者elnino
相关产品推荐
相关产品推荐

