PythonTimedelta[M] 添加不完整的天数

Python Timedelta[M] adds incomplete days

我有一个 table,它有一个列 Months_since_Start_fin_year 和一个日期列。我需要将第一列中的月数添加到第二列中的日期。

DateTable['Date']=DateTable['First_month']+DateTable['Months_since_Start_fin_year'].astype("timedelta64[M]")

这适用于第 0 个月,但第 1 个月已经有不同的时间,并且第 2 个月以后的日期有误。 Image of output table where early months have the correct date but month 2 where I would expect June 1st actually shows May 31st 一定是添加了不完整的月份,但我不确定如何解决?

我也试过了

DateTable['Date']=DateTable['First_month']+relativedelta(months=DateTable['Months_since_Start_fin_year'])

但我收到类型错误

TypeError: cannot convert the series to <class 'int'>

我的 Months_since_Start_fin_year 是 int32 类型,我的 First_month 变量是 datetime64[ns]

添加月份作为日期的偏移量的问题是并非所有月份都一样长(28-31 天)。所以你需要 pd.DateOffset 来为你处理这种歧义。另一方面,.astype("timedelta64[M]") 只为您提供一年内每月 平均 天 (30 days 10:29:06)。

例如:

import pandas as pd

# a synthetic example since you didn't provide a mre
df = pd.DataFrame({'start_date': 7*['2017-04-01'],
                   'month_offset': range(7)})

# make sure we have datetime dtype
df['start_date'] = pd.to_datetime(df['start_date'])

# add month offset
df['new_date'] = df.apply(lambda row: row['start_date'] + 
                                      pd.DateOffset(months=row['month_offset']),
                                      axis=1)

这会给你例如

df
  start_date  month_offset   new_date
0 2017-04-01             0 2017-04-01
1 2017-04-01             1 2017-05-01
2 2017-04-01             2 2017-06-01
3 2017-04-01             3 2017-07-01
4 2017-04-01             4 2017-08-01
5 2017-04-01             5 2017-09-01
6 2017-04-01             6 2017-10-01

您可以在 SO 上找到类似的示例,例如。我只是通过使用 apply 修改了那里的答案,以便能够从 DataFrame 的列之一中获取月份偏移量。