将datetime列的年份更改为另一列的年份+1

2024-06-26 12:39:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过以下方式计算周年列:保留日期和月份,并将年份更改为与开始列+1相同的年份

这是我的熊猫数据框:

| index |   start       |      end       |     anniversary|   
| ----- | -----------   | -------------- | -------------- | 
| 0     |   2008-02-11  |    2009-03-13  |   2009-02-11   |     
| 1     |   2009-03-13  |    2010-03-13  |   2009-02-11   |     
| 2     |   2010-03-13  |    2011-03-15  |   2009-02-11   |     

我想要的:

| index |   start       |      end       |     anniversary|   
| ----- | -----------   | -------------- | -------------- | 
| 0     |   2008-02-11  |    2009-03-13  |   2009-02-11   |     
| 1     |   2009-03-13  |    2010-03-13  |   2010-02-11   |     
| 2     |   2010-03-13  |    2011-09-19  |   2011-02-11   |      

Tags: 数据index方式startend年份月份anniversary
2条回答

您可以使用dt.yearstart列中获取日期时间的年组件,然后将其增量1,并将dtype更改为str。以类似的方式,从anniversary列中提取monthday组件。最后,连接所有单个组件并使用pd.to_datetime将其转换回datetime

year = df['start'].dt.year.add(1).astype(str)
month_day = df['anniversary'].dt.strftime('%m%d')

df['anniversary'] = pd.to_datetime(year + month_day, format='%Y%m%d')

>>> df
           start         end anniversary
index                                   
0     2008-02-11  2009-03-13  2009-02-11
1     2009-03-13  2010-03-13  2010-02-11
2     2010-03-13  2011-03-15  2011-02-11

只是为了好玩,一行程序实现:

out = df.assign(anniversary=pd.to_datetime(pd.concat(
          [df["start"].dt.year + 1, df["anniversary"].dt.month, df["anniversary"].dt.day],
          axis="columns").set_axis(["year", "month", "day"], axis="columns")))
>>> out
       start        end anniversary
0 2008-02-11 2009-03-13  2009-02-11
1 2009-03-13 2010-03-13  2010-02-11
2 2010-03-13 2011-03-15  2011-02-11

相关问题 更多 >