假设我有以下数据示例:
Parent
我想计算每周收入,以便以后绘制结果并分析时间序列。预期的输出将是这样的:
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
给定的星期数。
但是,我不知道如何处理第1周之前的周的ISO周编号定义。我有点困惑,因为在这种情况下,按timestamp.week
分组会年初和年底的收入。
答案 0 :(得分:5)
使用dt.week进行转换时,它是ISO week date。
您可以使用strftime
df.groupby(df.date.dt.strftime('%W')).revenue.sum()
Out[588]:
date
00 8
01 33
52 22
Name: revenue, dtype: int64
答案 1 :(得分:0)
我认为在这种情况下,您应该格外小心。如果您想获得多年的每周收入,则可以考虑将前几天转移到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"])
答案 2 :(得分:0)
您可以使用date
列作为索引,然后重新采样时间序列。
df.index = pd.to_datetime(df['date'])
df.resample('W').sum()
使用该解决方案,您甚至不需要week
和year
列。