簡體   English   中英

按星期Python分類數據

[英]Categorize Data by Day of Week Python

給定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,..”作為其他標題的簡潔表格格式

   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語句嗎?

對於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在星期幾的約定是Monday = 0,Sunday = 6

pandasgroupby函數執行其提示:它根據某些條件(在本例中為“星期幾”列)對數據進行分組。 然后, aggregate函數將在這些組上運行給定的函數,並為您提供結果。

您可以使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM