【问题标题】:Calculate average value by hour of json data按小时计算json数据的平均值
【发布时间】:2020-04-15 16:53:39
【问题描述】:

我无法按小时对样本进行分组。数据结构如下:

data = [
    {
        "pressure": "1009.7",
        "timestamp": "2019-09-03 08:03:00"
    },
    {
        "pressure": "1009.7",
        "timestamp": "2019-09-03 08:18:00"
    },
    {
        "pressure": "1009.8",
        "timestamp": "2019-09-03 08:33:00"
    },
    {
        "pressure": "1009.8",
        "timestamp": "2019-09-03 08:56:00"
    },
    {
        "pressure": "1009.8",
        "timestamp": "2019-09-03 09:03:00"
    },
    {
        "pressure": "1009.8",
        "timestamp": "2019-09-03 09:18:00"
    },
    {
        "pressure": "1009.8",
        "timestamp": "2019-09-03 09:33:00"
    },
    {
        "pressure": "1009.7",
        "timestamp": "2019-09-03 09:56:00"
    },
    {
        "pressure": "1009.6",
        "timestamp": "2019-09-03 10:03:00"
    }
]

如您所见,每小时测量 4 次压力,我想计算每小时的平均值。我试过用 Pandas 实现这一点,但没有运气。我尝试的是提取开始和结束时间戳,将它们四舍五入到整小时,然后将其作为索引传递给 DataFrame,并将 json 作为数据传递,但存在形状不匹配(难怪)。我认为我可以像这样将它传递给 df 然后尝试计算平均值,但看起来我应该有一些中间步骤。

【问题讨论】:

    标签: python json pandas


    【解决方案1】:

    我会通过创建一个新字典来解决这个问题,其中日期/小时作为键,压力作为列表(字典的值)。

    d = {}
    
    for _dict in data:
        key = _dict['timestamp'][:13] # 2019-09-03 08, etc.
        d.setdefault(key, []).append(float(_dict['pressure']))
    
    for key, array in d.items():
        print(key, format(sum(array) / len(array), '.3f'))
    

    打印:

    2019-09-03 08 1009.750
    2019-09-03 09 1009.775
    2019-09-03 10 1009.600
    

    【讨论】:

      【解决方案2】:

      如果您的 JSON 模仿上述内容,那么我们可以将其传递到数据帧中

      df = pd.DataFrame.from_dict(data)
          pressure            timestamp
      0   1009.7  2019-09-03 08:03:00
      1   1009.7  2019-09-03 08:18:00
      2   1009.8  2019-09-03 08:33:00
      3   1009.8  2019-09-03 08:56:00
      4   1009.8  2019-09-03 09:03:00
      5   1009.8  2019-09-03 09:18:00
      6   1009.8  2019-09-03 09:33:00
      7   1009.7  2019-09-03 09:56:00
      8   1009.6  2019-09-03 10:03:00
      

      然后按小时分组并取平均压力。

      hourly_avg = df.groupby(df['timestamp'].dt.hour)['pressure'].mean()
      print(hourly_avg)
      timestamp
      8     1009.750
      9     1009.775
      10    1009.600
      Name: pressure, dtype: float64
      

      注意,您需要将日期设置为适当的 DateTime 并将压力设置为浮点值。

      df['timestamp'] = pd.to_datetime(df['timestamp'])
      df['pressure'] = df['pressure'].astype(float)
      

      【讨论】:

        【解决方案3】:

        检查一下:

        df = pd.DataFrame(data)
        df['timestamp']=pd.to_datetime(df['timestamp'], format='%Y%m%d %H:%M:%S')
        df['pressure'] = df['pressure'].astype(float)
        df['hour'] = df['timestamp'].dt.hour
        
        pressure = df.groupby([df['hour']])['pressure'].mean()
        
        print(pressure)
        

        输出:

        timestamp
        8     1009.750
        9     1009.775
        10    1009.600
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-09
          • 2021-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-19
          • 1970-01-01
          • 2021-12-11
          相关资源
          最近更新 更多