【问题标题】:Is there a way to get an average per day from my dataset in Python?有没有办法从我的 Python 数据集中获得每天的平均值?
【发布时间】:2019-05-02 09:17:45
【问题描述】:

我有一个包含日期时间和温度的数据集,我使用对我的数据库的查询获得了该数据集。我不知道如何获得每天的平均值。我想创建一个带有 x 温度值的列表和另一个带有与该值关联的日期的数组,以便我可以将 2 绘制到图表中。

以下是我的数据集从查询返回时的样子:

[(21, datetime.datetime(2019, 4, 29, 9, 57, 53)), 
(22, datetime.datetime(2019, 4, 29, 9, 56, 52)), 
(26, datetime.datetime(2019, 4, 29, 9, 55, 49)), 
(22, datetime.datetime(2019, 4, 30, 9, 54, 49)), 
(20, datetime.datetime(2019, 4, 30, 9, 53, 49)), 
(19, datetime.datetime(2019, 5, 1, 9, 52, 48)), 
(18, datetime.datetime(2019, 5, 1, 9, 51, 47)), 
(21, datetime.datetime(2019, 5, 1, 9, 50, 46))]

我希望最终得到 2 个如下所示的列表:

values = [23, 21, 19.3]
labels = ["2019-4-29", "2019-4-30", "2019-5-1"]

我不确定如何处理我的数据,所以我最终得到了这样的结果,我什至不确定搜索方法的正确术语。

【问题讨论】:

    标签: python dataset data-manipulation


    【解决方案1】:

    如果您应该使用pandas,您可以执行以下操作:

    import pandas as pd
    
    df = pd.DataFrame([
        (21, datetime.datetime(2019, 4, 29, 9, 57, 53)), 
        (22, datetime.datetime(2019, 4, 29, 9, 56, 52)), 
        (26, datetime.datetime(2019, 4, 29, 9, 55, 49)), 
        (22, datetime.datetime(2019, 4, 30, 9, 54, 49)), 
        (20, datetime.datetime(2019, 4, 30, 9, 53, 49)), 
        (19, datetime.datetime(2019, 5, 1, 9, 52, 48)), 
        (18, datetime.datetime(2019, 5, 1, 9, 51, 47)), 
        (21, datetime.datetime(2019, 5, 1, 9, 50, 46)),
    ], columns=['value', 'date']).set_index('date')
    
    # resample groups your values by 'd' which stands for "day" and aggregate them by average
    df_day = df.resample('d').mean()
    

    这是pandas 文档的链接:http://pandas.pydata.org/pandas-docs/stable/

    【讨论】:

    • 谢谢你这工作完美!我唯一需要改变的是df_day = df.resample('d).mean()
    【解决方案2】:

    试试pandasd 是你的名单):

    import pandas as pd
    
    pd.DataFrame(d, columns=['Value', 'Date'])
    df.groupby(df['Date'].map(datetime.datetime.date)).mean()
    

    输出:

                    Value
    Date                 
    2019-04-29  23.000000
    2019-04-30  21.000000
    2019-05-01  19.333333
    

    【讨论】:

      【解决方案3】:

      有两种方法:

      1. 使用pandas

      尝试生成TimeSeries

      series = pd.DataFrame.from_values(data, columns=['Value', 'Date'], index=['Date'])
      result = series.resample("D").mean()
      

      输出:

                      Value
      Date                 
      2019-04-29  23.000000
      2019-04-30  21.000000
      2019-05-01  19.333333
      
      1. 不允许pandas

      使用普通的dict:

      from collections import defaultdict
      
      grouper = defaultdict(list)
      for value, date in data.items():
          grouper[date].append(value)
      
      values = [sum(day) / len(day) for day in grouper.values()]
      labels = list(grouper.keys())
      

      结果将与所讨论的示例相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        相关资源
        最近更新 更多