Pandas中如何按天过滤timedelta64类型并将时间差值转为字符串
针对timedelta列的过滤与字符串转换方案
先修正现有代码的常见笔误
df.['Date']多写了多余的点,正确写法是df['Date']pds.to_datetime("now")是拼写错误,应该是pd.to_datetime("now")dayfirst="True"不需要加引号,传布尔值即可,正确写法是dayfirst=True- 导出文件时用到的全角中文引号会触发语法错误,需替换为英文半角引号。
按天维度过滤Difference列
timedelta64类型的列不需要逐行判断,直接通过pandas的.dt访问器取天数维度的值做布尔索引即可,两种常用写法:
- 快速按整天数过滤(向下取整,比如6天23小时记为6天):
# 筛选时间差小于7天的行 df_filtered = df[df['Difference'].dt.days < 7] # 筛选时间差大于7天的行,替换判断条件即可 # df_filtered = df[df['Difference'].dt.days > 7] - 精准按自然时间阈值过滤(适合需要精确到小时/分钟的场景,比如差6天23小时不足7天就算小于阈值):
# 直接和7天的timedelta阈值做比较 threshold = pd.Timedelta(days=7) df_filtered = df[df['Difference'] < threshold]
把timedelta类型的Difference列转为字符串
同样不需要逐行遍历,可直接根据业务需求选择格式化方式:
- 转为系统默认格式字符串(如
3 days 02:15:40):df['Difference_str'] = df['Difference'].astype(str) - 转为业务自定义格式(如拼接为
3天2小时的易读格式):# 从timedelta组件中提取天、小时字段,拼接为自定义字符串 df['Difference_str'] = (df['Difference'].dt.days.astype(str) + "天" + df['Difference'].dt.components.hours.astype(str) + "小时")
为什么不需要使用iterrows
所有对datetime、timedelta列的操作都可以通过pandas原生向量化方法实现,不需要逐行遍历:
- 上述方法底层是C级别的实现,处理十万行级别的数据仅需毫秒级时间,效率是iterrows逐行循环的几十到上百倍。
- iterrows仅适合处理没有对应原生方法的复杂自定义逻辑,处理timedelta这类标准化时间列时用iterrows属于不必要的性能损耗。
完整可运行示例代码
import pandas as pd # 连接数据库读取数据(sql_con_obj为你已实现的数据库连接对象) sql = 'Select * from bd.teste' df = pd.read_sql_query(sql, sql_con_obj.con) # 转换Date列为datetime类型 df['Date'] = pd.to_datetime(df['Date'], dayfirst=True) # 计算与当前时间的差值列 current_time = pd.to_datetime("now") df["Difference"] = current_time - df['Date'] # 按天过滤:示例为保留时间差小于7天的行,可按需调整判断条件 df = df[df['Difference'].dt.days < 7] # 将Difference列转为自定义格式字符串,可直接覆盖原列 df['Difference'] = (df['Difference'].dt.days.astype(str) + "天" + df['Difference'].dt.components.hours.astype(str) + "小时") # 导出为xlsx,关闭默认的行索引导出 df.to_excel("generated.xlsx", index=False)
内容的提问来源于stack exchange,提问作者Ricardoke
相关产品推荐
相关产品推荐

