Панды групповой недели с учетом столбца даты и времени - PullRequest
0 голосов
/ 29 июня 2018

Допустим, у меня есть следующий образец данных:

df = pd.DataFrame({'date':['2011-01-01','2011-01-02',
                       '2011-01-03','2011-01-04','2011-01-05',
                       '2011-01-06','2011-01-07','2011-01-08',
                       '2011-01-09','2011-12-30','2011-12-31'],
                   'revenue':[5,3,2,
                              10,12,2,
                              1,0,6,10,12]})

# Let's format the date and add the week number and year
df['date'] = pd.to_datetime(df['date'],format='%Y-%m-%d')
df['week_number'] = df['date'].dt.week
df['year'] = df['date'].dt.year

df

        date        revenue     week_of_year    year
0       2011-01-01  5           52              2011
1       2011-01-02  3           52              2011
2       2011-01-03  2           1               2011
3       2011-01-04  10          1               2011
4       2011-01-05  12          1               2011
5       2011-01-06  2           1               2011
6       2011-01-07  1           1               2011
7       2011-01-08  0           1               2011
8       2011-01-09  6           1               2011
9       2011-12-30  10          52              2011
10      2011-12-31  12          52              2011

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

    week    revenue
0   1       8
1   2       33
2   52      22

Сначала я подумал об использовании номера недели, заданного timestamp.week.
Однако я не могу понять, как поступить с определением номера недели в ISO для недели, предшествующей неделе 1. Я немного растерялся, так как в этом случае группировка по week_number будет суммировать оба дохода в самое начало года и те, что в конце года.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Я думаю, что в этом случае вы должны быть очень осторожны. Если вы хотите получать еженедельный доход в течение многих лет, вы можете перенести первые дни на последнюю неделю 2010 года

import pandas as pd
import numpy as np

date =  pd.date_range(start="2011-01-01", end="2011-01-09")
date = [str(d)[:10] for d in date] + ["2011-12-30", "2011-12-31"]
rev =  np.random.randint(1,10, len(date))
df =  pd.DataFrame({"date": date, "rev":rev})
df["date"] =  df["date"].astype("M8[us]")

df["week"] = df["date"].dt.week
df["year"] = df["date"].dt.year
df["year"] = np.where((df["week"]==52) & (df["date"].dt.month==1), 
                      df["year"]-1,
                      df["year"])

df.groupby(["year", "week"])["rev"].sum()

Если в качестве альтернативы у вас есть первая 0 неделя, вы можете использовать это вместо

df["week"] = np.where((df["week"]==52) & (df["date"].dt.month==1),
                      0, 
                      df["week"])
0 голосов
/ 29 июня 2018

Вы можете использовать date столбец в качестве индекса, а затем пересчитать временной ряд.

df.index = pd.to_datetime(df['date'])
df.resample('W').sum()

С этим решением вам даже не нужны столбцы week и year.

0 голосов
/ 29 июня 2018

Когда вы конвертируете с помощью dt.week, это Дата недели ISO .

Вы можете использовать strftime

df.groupby(df.date.dt.strftime('%W')).revenue.sum()
Out[588]: 
date
00     8
01    33
52    22
Name: revenue, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...