如何移除DataFrame中时长列异常值?解决类型转换报错问题
解决Timedelta列类型转换与异常值移除问题
核心问题分析
你现在遇到两个关键问题:
- 时长列转整数的代码存在语法错误,逻辑思路不合理;
- 直接用Timedelta类型和整数对比触发类型不兼容报错。
一、修复时长列的整数转换
你原来的转换代码里dp是笔误(应为dt),且通过字符串强转整数的思路完全没必要。Pandas的Timedelta类型可以直接提取总秒数/分钟数得到整数:
# 计算时长 df['trip duration'] = df['tpep_dropoff_datetime'] - df['tpep_pickup_datetime'] # 转换为总秒数(整数类型) df['trip_duration_sec'] = df['trip duration'].dt.total_seconds().astype(int) # 可选:转换为分钟数整数 # df['trip_duration_min'] = (df['trip duration'].dt.total_seconds() // 60).astype(int)
二、解决异常值过滤的类型错误
Timedelta类型不能直接和整数(比如0)对比,有两种可行方案:
方案1:基于转换后的数值列过滤
用刚才生成的秒数/分钟数列做判断,同时合并距离的过滤条件(避免重复赋值覆盖之前的过滤结果):
# 同时过滤距离<6、时长>0的记录 df_2 = df[(df['trip_distance'] < 6) & (df['trip_duration_sec'] > 0)]
方案2:用pd.Timedelta构造时间对象对比
如果不想额外生成列,直接用pd.Timedelta构造时间阈值和原时长列对比:
df_2 = df[(df['trip_distance'] < 6) & (df['trip duration'] > pd.Timedelta(seconds=0))]
修正后的完整代码
import pandas as pd import matplotlib.pyplot as plt # 转换时间列格式 df['tpep_pickup_datetime'] = pd.to_datetime(df['tpep_pickup_datetime']) df['tpep_dropoff_datetime'] = pd.to_datetime(df['tpep_dropoff_datetime']) # 计算时长并转换为整数秒数 df['trip duration'] = df['tpep_dropoff_datetime'] - df['tpep_pickup_datetime'] df['trip_duration_sec'] = df['trip duration'].dt.total_seconds().astype(int) # 绘制距离列箱线图 fig = plt.figure(figsize=(10, 7)) plt.boxplot(df['trip_distance']) plt.show() # 绘制时长列箱线图(用转换后的数值列) fig = plt.figure(figsize=(10, 7)) plt.boxplot(df['trip_duration_sec']) plt.show() # 移除异常值 df_2 = df[(df['trip_distance'] < 6) & (df['trip_duration_sec'] > 0)]
内容的提问来源于stack exchange,提问作者H.C
相关产品推荐
相关产品推荐

