将日期列转换为相对于起始日期的天数差

本文介绍如何使用 pandas 将日期列快速转换为以首个(或最小)日期为基准的“天数差”列,适用于时间序列分析、特征工程等场景,核心方法是利用 `sub()` 和 `dt.days` 实现高效计算。

在数据分析中,常需将原始日期列标准化为相对天数(例如“距首日第几天”),便于建模或可视化。给定一个由年、月、日三列构成的 DataFrame,首先需将其合并为标准 datetime64 类型,再计算与参考日期的时间差。

以下为完整实现步骤:

  1. 构造并转换日期列:使用 pd.to_datetime(df) 自动解析年/月/日三列,返回 Series;再通过 .to_frame('Date') 转为单列 DataFrame;
  2. 计算天数差:对 Date 列调用 .sub() 方法减去参考日期(如首行 iloc[0] 或全局最小值 min()),结果为 timedelta64[ns] 类型;
  3. 提取整数天数:使用 .dt.days 属性获取精确的天数(忽略小时、分钟等),生成整型 Days_from_start 列。
import pandas as pd

df = pd.DataFrame({
    'year': [2015, 2015, 2015],
    'month': [2, 2, 2],
    'day': [4, 5, 10]
})

# 构建日期列并计算相对天数(以首行为基准)
out = pd.to_datetime(df).to_frame('Date')
out['Days_from_start'] = out['Date'].sub(out['Date'].iloc[0]).dt.days

print(out)

输出:

Deep Search

智能文献、网页检索与分析工具。AI赋能,洞悉万象,让知识检索与总结触手可及

        Date  Days_from_start
0 2015-02-04                0
1 2015-02-05                1
2 2015-02-10                6

⚠️ 注意事项:

  • 若数据含缺失值(NaT),.sub() 和 .dt.days 会自动返回 NaN,建议提前用 dropna() 或 fillna() 处理;
  • 使用 out['Date'].min() 可确保以最早日期为基准(适用于乱序数据);
  • .dt.days 返回的是完整日历天数(非工作日),若需排除周末/节假日,应改用 pd.bdate_range 或 np.busday_count 配合自定义逻辑。

该方法简洁、向量化、性能优异,是 pandas 时间特征工程中的标准实践。

相关推荐:

如何在Python中使用asyncio.shield防止关键任务被取消?

asyncio.shield必须用于关键清理操作(如日志落盘、事务提交、连接关闭),防止被取消中断导致数据不一致;应只包裹协程本身(shield(coro)),而非Task,且内部子await需单独shield。 asyncio.shield什么时候必须用? 当一个asyncio.Task正在执行关...

基于分支定界法的带卡车容量约束的运输问题求解教程

本文介绍如何将经典运输问题扩展为考虑6吨卡车整数装载限制的混合整数线性规划(milp)问题,并利用分支定界法(由求解器自动执行)求得全局最优解,重点在于建模技巧与变量耦合设计。 本文介绍如何将经典运输问题扩展为考虑6吨卡车整数装载限制的混合整数线性规划(milp)问题,并利用分支定界法(由求解器自动...

为什么Python单例模式在多线程环境下会失效?

__new__中判空非原子操作会导致多线程重复创建实例;DCL通过无锁初判+加锁后复判解决,需配合__init__幂等防护。 __new__中的if判断不是原子操作 线程A执行到ifcls._instanceisNone时为True,刚准备调用super().__new__(cls),此时被调度挂起...

如何修复Python aiohttp请求时出现的ClientPayloadError?

ClientPayloadError表明服务端提前关闭连接,非客户端代码错误;常见于服务端超时、拒绝大响应或代理截断,需通过抓包、检查响应头、服务端日志及添加读取超时和异常处理来定位解决。 ClientPayloadError通常意味着服务端提前关闭了连接 这个错误不是客户端代码写错了,而是aioh...

如何在 Python 模块中安全使用主程序的循环变量

python模块具有独立作用域,无法直接访问导入它的主程序中的变量(如循环计数器i);正确做法是通过函数参数显式传递值,而非重复import。 python模块具有独立作用域,无法直接访问导入它的主程序中的变量(如循环计数器i);正确做法是通过函数参数显式传递值,而非重复import。 在Pytho...