如何在Pandas中通过函数基于现有日期列生成新日期列?
问题描述
现有如下代码:
import pandas as pd file = pd.DataFrame() file['CASH RECIEVED DATE'] = ['2018-07-23', '2019-09-26', '2017-05-02']
需要创建名为Cash Received Date的列,规则为:当CASH RECIEVED DATE不为空且小于等于2022-09-01时,赋值为2019-09-01,否则取原列值。预期输出的列值为:
['2019-09-01', '2019-09-26', '2019-09-01']
请问如何通过创建函数实现该需求?
解决方案
步骤1:转换日期列类型
原始数据是字符串格式,首先要把CASH RECIEVED DATE列转为pandas的datetime类型,才能正常进行日期比较:
file['CASH RECIEVED DATE'] = pd.to_datetime(file['CASH RECIEVED DATE'])
步骤2:编写自定义处理函数
创建一个函数,接收单个日期值,按照规则返回对应结果:
def process_cash_date(date_val): # 检查日期非空且符合条件 if pd.notna(date_val) and date_val <= pd.to_datetime('2022-09-01'): return pd.to_datetime('2019-09-01') else: return date_val
步骤3:应用函数生成新列
用apply方法将函数作用于原日期列,生成目标列:
file['Cash Received Date'] = file['CASH RECIEVED DATE'].apply(process_cash_date)
完整可运行代码
import pandas as pd file = pd.DataFrame() file['CASH RECIEVED DATE'] = ['2018-07-23', '2019-09-26', '2017-05-02'] # 转换日期格式 file['CASH RECIEVED DATE'] = pd.to_datetime(file['CASH RECIEVED DATE']) # 定义处理函数 def process_cash_date(date_val): if pd.notna(date_val) and date_val <= pd.to_datetime('2022-09-01'): return pd.to_datetime('2019-09-01') else: return date_val # 生成目标列 file['Cash Received Date'] = file['CASH RECIEVED DATE'].apply(process_cash_date) # 查看结果 print(file['Cash Received Date'])
运行后输出结果符合预期:
0 2019-09-01 1 2019-09-26 2 2019-09-01 Name: Cash Received Date, dtype: datetime64[ns]
补充:大数据集高效替代方案
如果数据集规模较大,apply方法效率偏低,可以用矢量化的numpy.where实现逻辑,速度更快:
import numpy as np file['Cash Received Date'] = np.where( (pd.notna(file['CASH RECIEVED DATE'])) & (file['CASH RECIEVED DATE'] <= '2022-09-01'), '2019-09-01', file['CASH RECIEVED DATE'] ) # 若需保持datetime类型,可再转换一次 file['Cash Received Date'] = pd.to_datetime(file['Cash Received Date'])
内容的提问来源于stack exchange,提问作者rafatomillero
相关产品推荐
相关产品推荐

