Python 上一年和下一年的天数-熊猫

Python 上一年和下一年的天数-熊猫,python,python-3.x,pandas,dataframe,python-datetime,Python,Python 3.x,Pandas,Dataframe,Python Datetime,我有一个如下所示的数据框 df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51], 'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'], 'date_2': ['07/23/2017','05/29/2017','02/03/2015',np.

我有一个如下所示的数据框

df1 = pd.DataFrame({'person_id': [11, 21, 31, 41, 51],
                        'date_1': ['12/30/1961', '05/29/1967', '02/03/1957', '7/27/1959', '01/13/1971'],
                        'date_2': ['07/23/2017','05/29/2017','02/03/2015',np.nan,np.nan]})
df1 = df1.melt('person_id', value_name='dates')
我想得到上一年和下一年的天数

我可以使用下面的代码获取上一年和下一年的数据

df1['cur_year'] = pd.DatetimeIndex(df1['dates']).year
df1['prev_year'] = (df1['cur_year'] - 1)
df1['next_year'] = (df1['cur_year'] + 1)
正如您所看到的,
year
值对于每一行都在不断变化,并且我没有固定的基线日期,我如何计算上一年的
31/12
和下一年的
01/01
等日期之间的差值

请注意,获取天数时不包括结束日期

我在下面展示了两个主题的示例输出

更新的屏幕截图


据我所知,你可以试试

df1['dates'] = pd.to_datetime(df1['dates'])
out = df1.assign(prev_yr_days=df1['dates'].dt.dayofyear,
     next_yr_days=((df1['dates'] + pd.offsets.YearEnd(0)) - df1['dates']).dt.days.add(1))


我们可以根据您的行有条件地创建上一年和下一年的总和

df1["next_year"] = (
    pd.to_datetime(
        "01-01-" + (df1["dates"].dt.year + 1).fillna(0).astype(int).astype(str)
    )
    - df1["dates"]
)

df1["prev_year"] = (df1['dates'] - 
    pd.to_datetime(
        "31-12-" + (df1["dates"].dt.year - 1).fillna(0).astype(int).astype(str)
    )
    
)

print(df1)

   person_id variable      dates next_year prev_year
0         11   date_1 1961-12-30    2 days  364 days
1         21   date_1 1967-05-29  217 days  149 days
2         31   date_1 1957-02-03  332 days   34 days
3         41   date_1 1959-07-27  158 days  208 days
4         51   date_1 1971-01-13  353 days   13 days
5         11   date_2 2017-07-23  162 days  204 days
6         21   date_2 2017-05-29  217 days  149 days
7         31   date_2 2015-02-03  332 days   34 days
8         41   date_2        NaT       NaT       NaT
9         51   date_2        NaT       NaT       NaT

这里有一种方法:

dates = df['dates'].astype('datetime64')
df1['prev_yr_days'] = dates.dt.dayofyear
df1['next_yr_days'] = dates.dt.is_leap_year.sub(df1['prev_yr_days']).add(366)
结果:

   person_id variable       dates  prev_yr_day  next_yr_days
0         11   date_1  12/30/1961        364.0           2.0
5         11   date_2  07/23/2017        204.0         162.0
1         21   date_1  05/29/1967        149.0         217.0
6         21   date_2  05/29/2017        149.0         217.0
2         31   date_1  02/03/1957         34.0         332.0
7         31   date_2  02/03/2015         34.0         332.0
3         41   date_1   7/27/1959        208.0         158.0
8         41   date_2         NaN          NaN           NaN
4         51   date_1  01/13/1971         13.0         353.0
9         51   date_2         NaN          NaN           NaN

哦,这比我的尝试好多了,我不知道年底的偏移量,很好。你和往常一样棒极了。Thanks@TheGreat很高兴它起了作用……:)您好@anky,对于日期
2017-12-31
,我看到它正在为
到明年的天数生成值。这里应该是
0
,因为它已经是一年中的最后一天了,但正如您在屏幕截图中看到的,它显示为
365天
。@您可以尝试
pd.offset.YearEnd(0)
而不是1吗?
   person_id variable       dates  prev_yr_day  next_yr_days
0         11   date_1  12/30/1961        364.0           2.0
5         11   date_2  07/23/2017        204.0         162.0
1         21   date_1  05/29/1967        149.0         217.0
6         21   date_2  05/29/2017        149.0         217.0
2         31   date_1  02/03/1957         34.0         332.0
7         31   date_2  02/03/2015         34.0         332.0
3         41   date_1   7/27/1959        208.0         158.0
8         41   date_2         NaN          NaN           NaN
4         51   date_1  01/13/1971         13.0         353.0
9         51   date_2         NaN          NaN           NaN