Pandas如何将timedelta列转换为小时并按区间比较赋值
报错核心原因
两个datetime类型列做差得到的Duration是timedelta(时间差/时间长度)类型,不是具体时间点类型。pd.to_datetime()仅用于解析时间点(如日期字符串、时间戳),无法直接转换时间长度类型,强行调用就会触发报错。
实现方法
不需要转datetime类型,直接将timedelta换算为小时数值,再做条件判断即可。
- 核心注意点:判断顺序必须从阈值最大到最小,若从小到大判断会出现逻辑错误,比如>1的区间会提前覆盖>8、>24的情况。
完整可运行代码:
import pandas as pd import numpy as np # 构造数据集并转datetime格式 df = pd.DataFrame({'Start': {0: '2022-05-01 14:32:07', 1: '2022-05-01 13:09:20', 2: '2022-05-01 17:19:12', 3: '2022-05-01 16:12:03', 4: '2022-05-01 13:24:42', 5: '2022-05-01 02:24:17', 6: '2022-05-01 12:53:35', 7: '2022-05-01 09:57:34', 8: '2022-05-01 17:24:29', 9: '2022-05-01 09:58:15'}, 'End': {0: '2022-05-01 15:39:51', 1: '2022-05-02 13:10:56', 2: '2022-05-01 21:29:04', 3: '2022-05-01 23:56:27', 4: '2022-05-03 13:28:05', 5: '2022-05-01 16:24:18', 6: '2022-05-01 12:55:42', 7: '2022-05-01 19:57:35', 8: '2022-05-01 17:30:06', 9: '2022-05-01 19:58:16'}}) df = df.apply(pd.to_datetime) # 步骤1:计算时间差并换算为小时单位 df['Duration_h'] = (df['End'] - df['Start']).dt.total_seconds() / 3600 # 步骤2:按阈值从高到低判断赋值 df['result'] = np.where( df['Duration_h'] > 24, 'x', np.where(df['Duration_h'] > 8, 'y', np.where(df['Duration_h'] > 1, 'z', 'done')) )
运行结果
执行后输出如下,赋值逻辑完全符合要求:
Start End Duration_h result 0 2022-05-01 14:32:07 2022-05-01 15:39:51 1.128889 z 1 2022-05-01 13:09:20 2022-05-02 13:10:56 24.026667 x 2 2022-05-01 17:19:12 2022-05-01 21:29:04 4.164444 z 3 2022-05-01 16:12:03 2022-05-01 23:56:27 7.740000 z 4 2022-05-01 13:24:42 2022-05-03 13:28:05 48.056389 x 5 2022-05-01 02:24:17 2022-05-01 16:24:18 14.000278 y 6 2022-05-01 12:53:35 2022-05-01 12:55:42 0.035278 done 7 2022-05-01 09:57:34 2022-05-01 19:57:35 10.000278 y 8 2022-05-01 17:24:29 2022-05-01 17:30:06 0.093611 done 9 2022-05-01 09:58:15 2022-05-01 19:58:16 10.000278 y
提示:如果不需要保留中间计算的小时数列,可以在计算完成后用
df.drop(columns='Duration_h', inplace=True)删除即可。
内容的提问来源于stack exchange,提问作者Nagib
相关产品推荐
相关产品推荐

