используйте grouper для агрегирования по неделям с точного дня

#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