#python #pandas
#python #pandas
Вопрос:
Я хотел бы агрегировать свои данные по неделе, используя pandas grouper, где неделя заканчивается точно в тот же день, что и моя последняя дата, а не в конце недели.
Это код, который я написал:
fp.groupby(pd.Grouper(key='date',freq='w')).collectionName.nunique().tail(10)
И вот результаты:
date
2021-10-03 644
2021-10-10 698
2021-10-17 756
2021-10-24 839
2021-10-31 883
2021-11-07 905
2021-11-14 961
2021-11-21 1028
2021-11-28 990
2021-12-05 726
Freq: W-SUN, Name: collectionName, dtype: int64
Последняя дата, которая у меня есть 2021-12-02
, так что я бы хотел, чтобы это был последний день агрегата недели, и он возвращается каждые 7 дней до конца (в данном случае начало набора данных).
Мне нужна помощь в этом.
Ответ №1:
Используйте pd.DataFrame.resample
с rule='1w'
, on='date'
и origin='end_day'
Комментарии:
1. Нет, я имею в виду, используя тот же код, но вместо того, чтобы агрегировать его, заканчивающийся концом недели, то есть 2021-12-05, я хочу, чтобы он заканчивался последней датой, которая у меня есть, которая 2021-12-02
2. ValueError: ‘origin’ должен быть равен ‘epoch’, ‘start’, ‘start_day’ или должен быть конвертируемым типом метки времени. Вместо этого получил ‘end_day’.
3.
end_day
был добавлен в1.3.0
so, либо обновите, либо используйтеepoch
сoffset
(1970-1-1 был четверг, поэтому добавьте столько дней, сколько вам нужно, исходя из вашей последней строки)4. я обновил, конечный день не выдает ошибку, но я получаю те же результаты, что и всегда
Ответ №2:
Предполагается, что вы можете найти последнюю дату перед группировкой. Смотрите ссылки здесь: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases и вот здесь: https://www.programiz.com/python-programming/datetime/strftime
df = pd.DataFrame({'date': pd.date_range(start='2021-01-01 01:04:16', periods=250), 'val':range(1,251)})
date val
0 2021-01-01 01:04:16 1
1 2021-01-02 01:04:16 2
2 2021-01-03 01:04:16 3
3 2021-01-04 01:04:16 4
4 2021-01-05 01:04:16 5
.. ... ...
245 2021-09-03 01:04:16 246
246 2021-09-04 01:04:16 247
247 2021-09-05 01:04:16 248
248 2021-09-06 01:04:16 249
249 2021-09-07 01:04:16 250
[250 rows x 2 columns]
# locate last date and get day of week in correct format
anchor = df['date'].iat[-1].strftime("%a")
df.groupby(pd.Grouper(key='date',freq='w-' anchor)).nunique().tail(5)
# week ends on the same day as the original dataset
val
date
2021-08-10 7
2021-08-17 7
2021-08-24 7
2021-08-31 7
2021-09-07 7