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

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
009:00:00
109:30:00
217:00:00
315: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:36:23