本文介绍如何使用 pandas 将日期列快速转换为以首个(或最小)日期为基准的“天数差”列,适用于时间序列分析、特征工程等场景,核心方法是利用 `sub()` 和 `dt.days` 实现高效计算。
在数据分析中,常需将原始日期列标准化为相对天数(例如“距首日第几天”),便于建模或可视化。给定一个由年、月、日三列构成的 DataFrame,首先需将其合并为标准 datetime64 类型,再计算与参考日期的时间差。
以下为完整实现步骤:
-
构造并转换日期列:使用 pd.to_datetime(df) 自动解析年/月/日三列,返回 Series;再通过 .to_frame('Date') 转为单列 DataFrame;
-
计算天数差:对 Date 列调用 .sub() 方法减去参考日期(如首行 iloc[0] 或全局最小值 min()),结果为 timedelta64[ns] 类型;
-
提取整数天数:使用 .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 时间特征工程中的标准实践。
asyncio.shield必须用于关键清理操作(如日志落盘、事务提交、连接关闭),防止被取消中断导致数据不一致;应只包裹协程本身(shield(coro)),而非Task,且内部子await需单独shield。 asyncio.shield什么时候必须用? 当一个asyncio.Task正在执行关...
本文介绍如何将经典运输问题扩展为考虑6吨卡车整数装载限制的混合整数线性规划(milp)问题,并利用分支定界法(由求解器自动执行)求得全局最优解,重点在于建模技巧与变量耦合设计。 本文介绍如何将经典运输问题扩展为考虑6吨卡车整数装载限制的混合整数线性规划(milp)问题,并利用分支定界法(由求解器自动...
__new__中判空非原子操作会导致多线程重复创建实例;DCL通过无锁初判+加锁后复判解决,需配合__init__幂等防护。 __new__中的if判断不是原子操作 线程A执行到ifcls._instanceisNone时为True,刚准备调用super().__new__(cls),此时被调度挂起...
Renovate在GitHubActions中不推荐直接运行,因其非设计运行环境,缺乏长期运行、状态持久化和webhook驱动能力;官方推荐使用GitHubApp或自托管Docker镜像(如renovatebot/renovate),若必须用Actions则需严格限制为定时触发、配置专用token、...
直接open().read()或readlines()会将整个大文件一次性加载进内存,导致MemoryError;应使用withopen()asf:forlineinf逐行迭代,内存占用恒定。 为什么直接open()读大文件会爆内存 因为open().read()或open().readlines(...
ClientPayloadError表明服务端提前关闭连接,非客户端代码错误;常见于服务端超时、拒绝大响应或代理截断,需通过抓包、检查响应头、服务端日志及添加读取超时和异常处理来定位解决。 ClientPayloadError通常意味着服务端提前关闭了连接 这个错误不是客户端代码写错了,而是aioh...
python模块具有独立作用域,无法直接访问导入它的主程序中的变量(如循环计数器i);正确做法是通过函数参数显式传递值,而非重复import。 python模块具有独立作用域,无法直接访问导入它的主程序中的变量(如循环计数器i);正确做法是通过函数参数显式传递值,而非重复import。 在Pytho...
必须分块读取,推荐8192或65536字节块大小,以rb模式打开文件,循环调用update(),最后用hexdigest()获取32位小写十六进制字符串;校验时需strip().lower()统一格式并做长度校验。 用hashlib.md5()读取文件并计算校验和 直接调用hashlib.md5()...