0

在此处输入图像描述

我有一个带有 date 和 month_diff 变量的数据框。我想根据以下逻辑得到一个新的日期(命名为 Target_Date):例如日期是 2/13/2019,month_diff 是 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"])

它也失败了。

任何人都可以帮忙吗?谢谢你。

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

4

3 回答 3

0

你可以试试这个

import pandas as pd
from dateutil.relativedelta import relativedelta
df = pd.DataFrame({'Date': [pd.datetime(2019,1,1), pd.datetime(2019,2,1)], 'month_diff': [1,2]})
df.apply(lambda row: row.Date + relativedelta(months=row.month_diff), axis=1)

或列表理解

[date + relativedelta(months=month_diff) for date, month_diff in df[['Date', 'month_diff']].values]
于 2019-12-18T15:27:23.043 回答
0
import pandas as pd
from datetime import datetime
from datetime import timedelta 

这是我解决您问题的方法。但是由于某种原因,即使我确信这是正确的方法,我的输出中也会出现语义错误。如果您发现有问题,请大家纠正我。

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)

输出:

输出

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

于 2019-12-18T16:28:28.477 回答
0

我将采用以下方法来计算您的“target_date”。

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

解决方案可能如下所示:

import calendar
from dateutil.relativedelta import relativedelta

for ii in df.index:
    new_ = df.at[ii, 'start_date'] + relativedelta(months=df.at[ii, 'month_diff'])
    max_date = calendar.monthrange(new_.year, new_.month)[1]
    end_ = new_ + relativedelta(days=max_date - new_.day)
    print(end_)

进一步“清理”函数和/或列表理解可能会使其更快

于 2019-12-18T15:24:55.547 回答