Python Dataframe日期加上来自另一列的月份变量

Python Dataframe日期加上来自另一列的月份变量,python,dataframe,datetime,relativedelta,Python,Dataframe,Datetime,Relativedelta,我有一个带有日期和月份差异变量的数据框。我希望根据以下逻辑获得一个新日期(将其命名为Target_date): 例如,日期为2019年2月13日,月差为3,则目标日期应为原始日期的月底加上3个月,即2019年5月31日 我尝试了以下方法以首先获取traget日期: df["Target_Date"] = df["Date"] + pd.DateOffset(months = df["month_diff"]) 但它失败了,正如我所知,dateoffset中的参数应该是一个变量或一个固定的数字

我有一个带有日期和月份差异变量的数据框。我希望根据以下逻辑获得一个新日期(将其命名为Target_date): 例如,日期为2019年2月13日,月差为3,则目标日期应为原始日期的月底加上3个月,即2019年5月31日

我尝试了以下方法以首先获取traget日期:

df["Target_Date"] = df["Date"] + pd.DateOffset(months = df["month_diff"])
但它失败了,正如我所知,dateoffset中的参数应该是一个变量或一个固定的数字

我还尝试:

df["Target_Date"] = df["Date"] + relativedelta(months = df["month_diff"])
它也失败了

有人能帮忙吗?多谢各位

编辑:
这是一个包含数百万行的大型数据集。

我将采用以下方法来计算您的“目标日期”

  • 使用pd.DateOffset应用目标月偏移量(在您的情况下为+3个月)
  • 获取该目标月的最后一天(例如使用calendar.monthrange,另请参见“”)。这将为您提供该日期“补偿”的“灵活”部分
  • 在比较步骤1和步骤2的结果时,应用灵活的日偏移量。这可能是一个新的pd.DateOffset
  • 解决方案可能如下所示:

    导入日历
    从dateutil.relativedelta导入relativedelta
    对于df.index中的ii:
    在[ii'开始日期']+相对延迟(月数=在[ii'月数差异']时的延迟)
    最大日期=日历月(新的年,新的月)[1]
    结束=新建+相对延迟(天数=最长日期-新建天数)
    打印(结束)
    
    对函数和/或列表的进一步“清理”可能会使其速度更快

    您可以试试这个

    将熊猫作为pd导入
    从dateutil.relativedelta导入relativedelta
    df=pd.DataFrame({'Date':[pd.datetime(2019,1,1),pd.datetime(2019,2,1)],'month_diff':[1,2]})
    df.apply(lambda行:行.日期+相对LTA(月=行.月差异),轴=1)
    
    或列表理解

    [date + relativedelta(months=month_diff) for date, month_diff in df[['Date', 'month_diff']].values]
    
    这是我解决你们问题的方法。 然而由于某种原因,我的输出中出现了一个语义错误,尽管我确信这是正确的方法。如果您注意到一些错误,请大家纠正我

    today = datetime.now()
    today = today.strftime("%d/%m/%Y")
    month_diff =[30,5,7]
    n = 30
    for i in month_diff:
        b = {'Date': today, 'month_diff':month_diff,"Target_Date": datetime.now()+timedelta(days=i*n)}
        df = pd.DataFrame(data=b)
    
    输出:


    由于某些原因,i没有得到更新。

    relativedelta
    在这样的系列上不起作用。请尝试:
    df.apply(lambda行:行.日期+relativedelta(月=行.月_diff)
    。可能会更改轴或其他东西。但是,如果数据太大,这将不会太有效。您想检索结束日期还是月份差异?@bramb我正在尝试检索表中突出显示的
    目标日期。
    。好的,您试过下面的部分吗?谢谢,bramb。此解决方案在df.index中使用
    for iiode>,这是一种循环,我认为对于大型数据集来说这很耗时。对吗?您可以将其更改为列表理解或函数。这将使其更高效;)
    
    today = datetime.now()
    today = today.strftime("%d/%m/%Y")
    month_diff =[30,5,7]
    n = 30
    for i in month_diff:
        b = {'Date': today, 'month_diff':month_diff,"Target_Date": datetime.now()+timedelta(days=i*n)}
        df = pd.DataFrame(data=b)