我有两个数据列表,一个是日期和平均值,另一个是索引和另一个值,它们看起来像:
#list 1: (in total 62 raws)
date d_mean
2017-3-1 15.3
2017-3-2 16.9
2017-3-3 18.2
...
2017-4-30 17.7
2017-5-1 15.6
#list2: (in total 10 raws)
sum
121 555
122 784
123 546
...
142 568
143 658
144 847
我想:
我尝试使用
chunks = [avg_T1[x:x+7] for x in range(4, len(avg_T1), 7)]
但这只是将列表分开,我试图添加
.mean()
最后,并没有真正发挥作用。
我是Python的新手,我也很高兴听到我是否需要阅读或练习必要的材料,以帮助我使用Python。
答案 0 :(得分:2)
如果没有原始数据,很难回答,但您可以将pandas.DataFrame.groupby
与自定义函数结合使用:index / 7
或使用strftime('%V')
获取周数:
import pandas as pd
import datetime
import numpy as np
start = datetime.datetime(2017,3,1)
end = datetime.datetime(2017,5,2)
daterange = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]
data = pd.DataFrame({'date':daterange, 'v':np.random.randint(0,100,size=len(daterange))}).set_index('date')
data
现在看起来像:
v
date
2017-03-01 1
2017-03-02 40
2017-03-03 49
2017-03-04 27
2017-03-05 37
2017-03-06 90
2017-03-07 88
2017-03-08 42
2017-03-09 90
2017-03-10 84
2017-03-11 47
2017-03-12 24
2017-03-13 18
2017-03-14 24
2017-03-15 38
2017-03-16 71
2017-03-17 11
2017-03-18 40
...
以下是strftime
的结果:
>>> data.groupby(lambda d: d.strftime('%V')).mean()
v
09 30.800000
10 66.428571
11 36.285714
12 40.857143
13 55.428571
14 56.285714
15 52.000000
16 39.714286
17 39.714286
以下是day of year / 7
的结果:
>>> data.groupby(lambda d: d.timetuple().tm_yday//7).mean()
v
8 30.000000
9 65.428571
10 33.285714
11 48.857143
12 46.571429
13 58.000000
14 47.428571
15 41.428571
16 45.285714
17 33.500000
这取决于你如何定义一周。
请注意,如果数据超过一年,它将无效。您可能应该使用@RSHAP提到的resample
。
答案 1 :(得分:2)
我不确定我是否完全理解你的问题,但第一部分的答案应该是
df = df.set_index('date')
df['w_mean'] = df.resample('w').d_mean.mean().
这是每周数据帧的平均值(我认为你称之为列表)。
我不知道你是如何让两个列表长度相同的,因为它们在同一时间段内处于不同的频率。
你将拥有的是一个列('w_mean'),每7天就有一个值,而其他地方都是nans。
你可以做df.interpolate().plot()
是我能想到的最接近的事情......