Как группировать данные по настраиваемой логике дат?

#python #pandas

Вопрос:

У меня есть фрейм данных, который выглядит так:

 Date       | Apples | Bananas etc
2020-01-01 | 2      | 5
2020-02-01 | 12     | 44
2020-03-01 | 4      | 45
 

Я хочу создать логику группировки по дате, но дата должна быть преобразована в следующую:

Если дата приходится на февраль текущего года или после этой даты, то обозначьте дату как следующий соответствующий год, в противном случае обозначьте как текущий соответствующий год. Пример:

Для яблок на 2020-01-01 год он должен быть помечен как «2020», потому что он предшествует февралю текущего года. Однако бананы в 2020-03-01 годах будут помечены как «2021», потому что дата выпадает после февраля текущего года.

 Date | Apples | Bananas etc
2020 | 2      | 5
2021 | 12     | 44
2021 | 4      | 45
 

Как это будет работать лучше всего?

Комментарии:

1. Почему на 2021 год есть две строки? Разве их не следует сложить вместе?

Ответ №1:

Вы можете использовать np.where для выполнения условного смещения даты.

 import pandas as pd
import numpy as np

df = pd.DataFrame({'Date': ['2020-01-01', '2020-02-01', '2020-03-01'],
 'Apples': [2, 12, 4],
 'Bananas': [5, 44, 45]})

df['Date'] = pd.to_datetime(df['Date'])
# Add a year if the month is greater than 1
df['Date'] = np.where(df['Date'].dt.month>1, df['Date']  pd.offsets.DateOffset(years=1), df['Date'])



# If you want the actual dates
print(df.groupby('Date').sum())

            Apples  Bananas
Date                       
2020-01-01       2        5
2021-01-31      12       44
2021-03-01       4       45

# If you want grouped by year only
print(df.groupby(df['Date'].dt.year).sum())

      Apples  Bananas
Date                 
2020       2        5
2021      16       89
 

Комментарии:

1. спасибо, Крис, я на самом деле не хочу, чтобы они были сгруппированы. В таком случае, нам действительно нужна группа. Мне нужны только метки измененного года в кадре данных. Не могли бы вы скорректировать свой код, пожалуйста?

2. df будет то, что ты хочешь, просто print(df)