pandas中计算当前时间与Dataframe Creation列的时间差时排除周六周日
Pandas计算排除周末的时间差实现方案
原代码基础修正
你原来的代码有两个会影响运行的小问题,先修正再实现需求:
dayfirst="True"传了字符串类型的判断值,会触发pandas警告,要改成布尔值dayfirst=Truedf.to_datetime('now')是错误的方法调用,to_datetime属于pandas顶层方法,不绑定DataFrame实例,直接运行会报错,正确写法是pd.to_datetime('now')
修正后的基础前置代码:
import pandas as pd import numpy as np # 保留原有的Creation列时间转换逻辑 df['Creation'] = pd.to_datetime(df["Creation"], dayfirst=True) current_time = pd.to_datetime('now')
不计入周末的天数差计算
要求保持原有输出粒度(按自然天计数),但跳过周六、周日,两种可直接落地的实现方式:
大数据量场景:高效无循环计算
用numpy内置的busday_count方法,默认就是统计区间内周一到周五的工作日天数,自动排除周末,百万行级数据计算也不会卡顿:
# 统一把带时分秒的时间规整到当天零点,避免计数偏差 create_norm = df['Creation'].dt.normalize() current_norm = current_time.normalize() # 生成存储工作日天数的Difference列 df['Difference'] = np.busday_count( begindates=create_norm.values.astype('datetime64[D]'), enddates=current_norm.to_datetime64() )
该方法的计数逻辑为“算头不算尾”,和日常自然日差的计数规则完全对齐,不需要额外调整数值。
需要自定义规则场景:灵活可扩展计算
用pandas自带的bdate_range生成工作日频率的时间轴,统计区间内的日期数量得到差值。后续如果需要额外排除法定节假日,只需要给函数传入自定义节假日列表即可,不用重写核心计算逻辑:
def get_workday_gap(start_dt, end_dt): # 生成两个日期之间的所有工作日 workday_days = pd.bdate_range( start=start_dt.normalize(), end=end_dt.normalize() ) # 去掉首尾重合的1天,对齐自然日差的计数粒度 return len(workday_days) - 1 # 逐行应用计算差值 df['Difference'] = df['Creation'].apply( lambda row: get_workday_gap(row, current_time) )
注意事项
- 两种实现方式都自动跳过所有周六、周日,不会将周末天数计入
Difference列 - 统一对时间做零点规整后,不会因为创建时间带具体时分秒出现负数、计数少算的问题
- 不需要手动逐行遍历判断日期是周几,计算效率远高于自定义循环逻辑
内容的提问来源于stack exchange,提问作者Ricardoke
相关产品推荐
相关产品推荐

