Python中将Object类型转为datetime及计算日期差求年数
不同格式日期转datetime及年数差计算方案
1. 转换birth_date列
birth_date是日/月/年格式(如22/7/1998),用pd.to_datetime()指定格式精准转换:
import pandas as pd df['birth_date'] = pd.to_datetime(df['birth_date'], format='%d/%m/%Y')
2. 转换consultation_timestamp列
该列是带时区的ISO格式(如2017-09-27t13:47+00:00),pd.to_datetime()可直接识别,若需统一时区(比如移除时区信息避免后续冲突),可额外处理:
df['consultation_timestamp'] = pd.to_datetime(df['consultation_timestamp']) # 可选:转UTC后移除时区 df['consultation_timestamp'] = df['consultation_timestamp'].dt.tz_convert(None)
3. 计算年数差
直接相减得到天数,用relativedelta能精确计算周岁差:
先安装依赖(未安装时执行):
pip install python-dateutil
然后计算:
from dateutil.relativedelta import relativedelta # 逐行计算年数差 df['age_at_consult'] = df.apply( lambda row: relativedelta(row['consultation_timestamp'], row['birth_date']).years, axis=1 )
如果不想用额外依赖,也可以用向量操作实现:
# 提取日期组件 birth_ymd = df['birth_date'].dt consult_ymd = df['consultation_timestamp'].dt # 基础年数差 age = consult_ymd.year - birth_ymd.year # 修正未过生日的情况 mask = (consult_ymd.month < birth_ymd.month) | \ ((consult_ymd.month == birth_ymd.month) & (consult_ymd.day < birth_ymd.day)) age[mask] -= 1 df['age_at_consult'] = age
注意事项
- 不要用
pd.datetime,该API已被弃用,官方推荐使用pd.to_datetime()。 - 指定
format参数不仅能提升转换效率,还能避免格式歧义(比如10/9/2023可能被误判为月/日/年)。 - 若两个日期时区不同,必须先统一时区再计算,否则会抛出错误。
内容的提问来源于stack exchange,提问作者abmcdonald
相关产品推荐
相关产品推荐

