按小时计算JSON数据的平均值

3

我在对样本按小时分组时遇到了问题。数据结构如下:

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,然后尝试计算平均值,但是似乎需要一些中间步骤。

3个回答

3
如果您的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)

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

1

Check this:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接