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 的列之一中获取月份偏移量。
我有一个 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 的列之一中获取月份偏移量。