如何在Pandas中计算每行baseline_date与days列相加后的最大日期并生成新列
实现方法:为Pandas DataFrame每行计算日期相加后的最大值
嘿,这个需求我之前做项目时刚好碰到过,给你分享几种靠谱的实现方式,按需选择就行:
方法一:使用apply逐行计算(直观易懂,适合小数据集)
这种方法逻辑最直接,对每行单独处理,把三个日期算出来再取最大值:
import pandas as pd # 先确保baseline_date是datetime类型(如果原始数据是字符串的话) df['baseline_date'] = pd.to_datetime(df['baseline_date']) # 定义逐行处理的函数 def get_max_date(row): date1 = row['baseline_date'] + pd.Timedelta(days=row['days_1']) date2 = row['baseline_date'] + pd.Timedelta(days=row['days_2']) date3 = row['baseline_date'] + pd.Timedelta(days=row['days_3']) return max(date1, date2, date3) # 生成新列max_date df['max_date'] = df.apply(get_max_date, axis=1)
方法二:矢量化操作(高效,适合大数据集)
apply在数据量大的时候会有点慢,用矢量化的方式直接列运算,速度会快很多:
import pandas as pd # 同样先确保baseline_date是datetime类型 df['baseline_date'] = pd.to_datetime(df['baseline_date']) # 分别计算三个日期列 df['date_1'] = df['baseline_date'] + pd.to_timedelta(df['days_1'], unit='D') df['date_2'] = df['baseline_date'] + pd.to_timedelta(df['days_2'], unit='D') df['date_3'] = df['baseline_date'] + pd.to_timedelta(df['days_3'], unit='D') # 按行取最大值,axis=1表示横向取数 df['max_date'] = df[['date_1', 'date_2', 'date_3']].max(axis=1) # 如果不需要中间的日期列,可以直接删掉 df = df.drop(columns=['date_1', 'date_2', 'date_3'])
补充小技巧:一行搞定的简化写法
如果不想生成中间列,也可以用pd.concat把三个计算后的序列合并,再直接取最大值:
df['max_date'] = pd.concat([ df['baseline_date'] + pd.to_timedelta(df['days_1'], unit='D'), df['baseline_date'] + pd.to_timedelta(df['days_2'], unit='D'), df['baseline_date'] + pd.to_timedelta(df['days_3'], unit='D') ], axis=1).max(axis=1)
这里要注意两个关键点:
- 必须保证
baseline_date是datetime类型,否则日期相加会报错,原始是字符串的话一定要用pd.to_datetime转换 - 列级运算时用
pd.to_timedelta比pd.Timedelta更适配,它能直接接收整数列作为参数
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

