如何将日期分成几周并在Python 3.6中创建一个新列表?

时间:2017-10-19 12:59:13

标签: python

我有两个数据列表,一个是日期和平均值,另一个是索引和另一个值,它们看起来像:

#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

我想:

  1. 将日期分为几周
  2. 计算每周的平均值,并使用列“周”创建一个新列表。和' w_mean'
  3. 使这两个列表的大小相同,然后将它们相互映射
  4. 我尝试使用

        chunks = [avg_T1[x:x+7] for x in range(4, len(avg_T1), 7)]
    

    但这只是将列表分开,我试图添加

        .mean()
    

    最后,并没有真正发挥作用。

    我是Python的新手,我也很高兴听到我是否需要阅读或练习必要的材料,以帮助我使用Python。

2 个答案:

答案 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()是我能想到的最接近的事情......