我在一个系列中有五个星期的季节性数据,包含日期和时间,我如何根据周,如第1周,第2周...第5周将其分开,以便我可以在同一图表中绘制所有周数据。
我试着通过找到平均值来重新抽样数据。但数据仍然是单一系列。我只想根据2019-04-02到2019-04-08之间的数据在不同的数据帧,2019-04-08到2019-04-16之间分开数据。
df.open.resample('M').mean()
date pageload day
0 2019-04-02 10:48:00 -79.002023 Tue
1 2019-04-02 10:49:00 33.563679 Tue
2 2019-04-02 10:50:00 -76.448319 Tue
3 2019-04-02 10:51:00 30.974816 Tue
4 2019-04-02 10:52:00 -68.789962 Tue
5 2019-04-02 10:53:00 30.593374 Tue
21 2019-04-16 11:34:00 40.333445 Fri
数据框在星期分开。在单个图中绘制所有周数据。
我不认为你想像Shijith那样重新取样。我想你想要每周不同的数据帧。 IMO你想使用groupby(doc)。 Pandas Groupby函数可用于按列或索引拆分数据框中的数据。该方法返回一个pandas groupby对象,该对象可用于在合并它们之前对组执行操作。
在代码片段中,我首先创建一个列来对数据进行分组(即“周”列)。比我按周列分组数据。这将创建一个groupby对象,其中包含一个字典,该字典具有“周”列的唯一值作为键,数据帧的索引列表与“周”列具有相同的值作为值。通过在控制台中键入print(grps.groups)
可以看到这一点。比我循环遍历组的键并通过调用groupby对象上的get_group
方法将每个星期数据帧添加到字典中。
import pandas as pd
# Make sample data
index=pd.date_range(start='2014-01-01', end='2014-1-31',freq='D')
df = pd.DataFrame({"vals":np.random.randint(-5,5,len(index))}, index=index)
df["csum"] = df.vals.cumsum()
# Add a column for weeks to enable grouping
df["weeks"] = df.index.week
# Group the data
grps = df.groupby("weeks")
# split the group into separate dataframes
df_dict = {}
for gi in grps.groups:
df_dict[gi] = grps.get_group(gi)
我从这样的事情开始:
vals csum weeks
2014-01-01 4 4 1
2014-01-02 -5 -1 1
...
2014-01-30 -2 -9 5
2014-01-31 -5 -14 5
最终得到如下数据框架
1
vals csum weeks
2014-01-01 4 4 1
2014-01-02 -5 -1 1
2014-01-03 -4 -5 1
2014-01-04 4 -1 1
2014-01-05 -5 -6 1
2
vals csum weeks
2014-01-06 -5 -11 2
2014-01-07 2 -9 2
2014-01-08 4 -5 2
2014-01-09 -1 -6 2
2014-01-10 -1 -7 2
2014-01-11 -3 -10 2
2014-01-12 -2 -12 2
如果您的数据框df
在日期编制索引
print(df)
High Low Open Close Volume Adj Close
Date
2019-04-01 191.679993 188.380005 191.639999 191.240005 27862000 191.240005
2019-04-02 194.460007 191.050003 191.089996 194.020004 22765700 194.020004
2019-04-03 196.500000 193.149994 193.250000 195.350006 23271800 195.350006
2019-04-04 196.369995 193.139999 194.789993 195.690002 19114300 195.690002
2019-04-05 197.100006 195.929993 196.449997 197.000000 18526600 197.000000
2019-04-08 200.229996 196.339996 196.419998 200.100006 25881700 200.100006
2019-04-09 202.850006 199.229996 200.320007 199.500000 35768200 199.500000
2019-04-10 200.740005 198.179993 198.679993 200.619995 21695300 200.619995
2019-04-11 201.000000 198.440002 200.850006 198.949997 20900800 198.949997
2019-04-12 200.139999 196.210007 199.199997 198.869995 27760700 198.869995
做,
weekly_summary = pd.DataFrame()
weekly_summary['Open'] = df.open.resample('W').first()
print(weekly_summary)
Open
Date
2019-04-07 191.639999
2019-04-14 196.419998
如果没有在日期时间编入索引,
df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df.sort_index(inplace=True)
weekly_summary = pd.DataFrame()
weekly_summary['Open'] = df.open.resample('W').first()
对于上述代码,数据框将在“星期日”编入索引,如果您希望在“星期一”(即一周的开始日期)编制索引,请执行以下操作。
weekly_summary = pd.DataFrame()
weekly_summary['Open'] = df.open.resample('W',loffset=pd.offsets.timedelta(days=-6)).first()
print(weekly_summary)
Open
Date
2019-04-01 191.639999
2019-04-08 196.419998