【问题标题】:Categorize Data by Day of Week Python按 Python 中的星期几对数据进行分类
【发布时间】:2015-11-06 00:02:50
【问题描述】:

给定 Python 2.7 中的列表:

[['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]

您一般如何打印出列表的平均值;然后根据一周中的某一天计算平均值。例如:

2.5, 6.5, 10.5, 9, 1.5, 4.5, 7.5, 5, 2, 4, 6, 8

地点:

1.5、4.5、7.5、5 是上面产生的平均值,因为星期二在这个列表中出现了两次

2.5, 6.5, 10.5, 9 是一般列表的平均值

那么 2、4、6、8 是星期四发生的平均值

我很确定我可以使用 zip() 函数来获取所有类似的值。我只是不确定一周中每天计算的平均值(周一、周二、周三……)

我如何将它组织成一个干净的表格格式,其中“平均值”和“星期一,星期二,..”作为其他标题

   Averages     Monday      Tuesday      Wednesday   Thursday   Friday  Saturday Sunday
2.5 6.5 10.5 9    0      1.5 4.5 7.5 5       0       2 4 6 8       0       0       0

我应该使用 if 语句吗?

【问题讨论】:

  • Python 没有 switch 语句。
  • 呃,在那之后我感觉自己像个菜鸟

标签: python list if-statement zip enumerate


【解决方案1】:

这对pandas 来说似乎是一项出色的工作:

from __future__ import print_function   
import pandas as pd
import numpy as np

raw_data = [['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]
pandas_data = pd.DataFrame(raw_data, columns=['Date', 'A', 'B', 'C', 'D'])
pandas_data["Date"] = pd.to_datetime(pandas_data["Date"])
print(pandas_data)
print(pandas_data.mean())

输出:

        Date  A  B  C  D
0 2015-10-27  2  4  6  8
1 2015-11-03  1  5  9  2
2 2015-11-05  2  4  6  8

A    1.666667
B    4.333333
C    7.000000
D    6.000000

这为我们提供了所有列的汇总统计信息,但对于一周中的特定日子,我会做这样的事情(按照上面的代码):

pandas_data["Day of the Week"] = pandas_data["Date"].dt.dayofweek
grouped_data = pandas_data.groupby('Day of the Week').aggregate(np.mean)
print(grouped_data)

输出:

                   A    B    C  D
Day of the Week
1                1.5  4.5  7.5  5
3                2.0  4.0  6.0  8

pandas' 星期几的约定是星期一=0,星期日=6

pandas'groupby 函数按照它在锡上所说的那样做:它根据一些标准对数据进行分组,在本例中是“星期几”列。然后aggregate 函数在这些组上运行给定的函数并为您提供结果。

【讨论】:

    【解决方案2】:

    您可以使用itertools.groupby

    from itertools import groupby
    import datetime
    
    
    l = [['OCT 27, 2015', 2, 4, 6, 8],
         ['NOV 03, 2015', 1, 5, 9, 2],
         ['NOV 05, 2015', 2, 4, 6, 8]]
    
    
    # Day of week as number. Monday == 0 ... Sunday == 6
    def day_of_week(str_date):
        return datetime.datetime.strptime(str_date, '%b %d, %Y').weekday()
    
    
    stats = [None] * 7
    for key, group in groupby(l, key=lambda x: day_of_week(x[0])):
        z = zip(*group)
        next(z)  # skip dates
        stats[key] = [sum(i) / len(i) for i in z]
    
    print(stats)
    

    输出:

    [None, [1.5, 4.5, 7.5, 5.0], None, [2.0, 4.0, 6.0, 8.0], None, None, None]
    

    【讨论】:

      猜你喜欢
      • 2011-10-31
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 2022-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多