количество дней до предыдущего и следующего года - Pandas - PullRequest
2 голосов
/ 17 июня 2020

У меня есть фрейм данных, как показано ниже

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 для следующего года.

Обратите внимание, что end date is not included while getting the number of days

Ниже я показал образец вывода для 2 предметов.

enter image description here

обновленный скриншот

u

Ответы [ 3 ]

2 голосов
/ 17 июня 2020

IIU C, мы можем условно создать предыдущий и следующий год на основе вашей строки для суммирования.

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
2 голосов
/ 17 июня 2020

Вот один из способов сделать это:

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
2 голосов
/ 17 июня 2020

Насколько я понимаю, вы можете попробовать;

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))

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