【问题标题】:How to divide dates into weeks and create a new list in Python 3.6?如何在 Python 3.6 中将日期划分为周并创建一个新列表?
【发布时间】:2017-10-19 12:59:13
【问题描述】:

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

#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. 计算每周的平均值并创建一个包含“week”和“w_mean”列的新列表
  3. 使这两个列表大小相同,然后将它们相互绘制

我尝试使用

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

但这只是划分列表,我尝试添加

    .mean()

最后,真的没用。

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

【问题讨论】:

  • 您有数据的可复制粘贴示例吗?
  • 使用 pandas 将日期列转换为日期时间索引,将resample 转换为周频率,取平均值。

标签: python


【解决方案1】:

我不确定我是否完全理解你的问题,但第一部分的答案应该是

df = df.set_index('date')
df['w_mean'] = df.resample('w').d_mean.mean(). 

这是数据框每周的平均值(我认为您称之为列表)。

我不知道如何使这两个列表的长度相同,因为它们在同一时间段内的频率不同。

您将拥有一个列 ('w_mean'),每 7 天有一个值,其他任何地方都有一个 nan。

你可以做到df.interpolate().plot()是我能想到的最接近的事情......

【讨论】:

  • 真的很好,我不知道resample
【解决方案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

【讨论】:

  • 这里唯一的危险是,如果你有超过一年的数据(看起来不像 OP 那样),它会在一年中的每一周聚合在一起(即 2015 年的第 1 周将合并2016 年第 1 周和所有其他年份)
  • @RSHAP:确实。你的方法更好。
  • 这真的很有帮助!
猜你喜欢
  • 2022-07-29
  • 2015-06-15
  • 2016-06-16
  • 2019-05-09
  • 2018-02-11
  • 1970-01-01
  • 2010-09-29
  • 2018-01-30
  • 1970-01-01
相关资源
最近更新 更多