You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Open-Meteo API逐小时数据处理:拆分为0-24列及单列浓缩求助

解决方案:Open-Meteo逐小时气象数据格式转换

首先纠正你代码里的核心问题:直接将整个api_data转为DataFrame是错误的,因为api_data里的hourly是嵌套字典(包含time和各辐射指标的列表),而非字符串。正确的做法是直接提取hourly字段来构建初始DataFrame。

以下是针对你两个需求的具体实现:

第一步:正确解析API数据

import requests
import pandas as pd

api_url = "https://api.open-meteo.com/v1/forecast?latitude=51.4325&longitude=6.7652&hourly=shortwave_radiation,direct_radiation,diffuse_radiation,direct_normal_irradiance,terrestrial_radiation" 
response = requests.get(api_url)

if response.status_code == 200:
    api_data = response.json()
    # 直接用hourly字典构建DataFrame,这是正确的初始数据结构
    hourly_df = pd.DataFrame(api_data['hourly'])
else:
    print("Fehler beim Abrufen der API-Daten")
    hourly_df = None

此时hourly_df的结构是:每行对应一个小时,列包含time和各个辐射指标(如shortwave_radiation)。


需求一:将逐小时数据浓缩为一小时间隔的单列(长格式)

如果你的需求是把所有辐射指标的数值合并到单列,同时保留时间和指标类型,可以用pd.melt实现:

# 转换为长格式:time(时间)、radiation_type(指标类型)、value(数值)
long_format_df = hourly_df.melt(
    id_vars='time',
    var_name='radiation_type',
    value_name='radiation_value'
)

最终long_format_df的结构示例:

timeradiation_typeradiation_value
2024-05-20T00:00:00shortwave_radiation0.0
2024-05-20T01:00:00shortwave_radiation0.0
.........
2024-05-20T00:00:00terrestrial_radiation200.1

需求二:拆分为标签0至23的多列结构(宽格式)

这里默认你需要按日期分组,将每天的0-23小时作为列,每个辐射指标单独生成宽表(或合并为多层级列)。步骤如下:

  1. 从time列提取日期和小时:
# 转换time列为datetime类型,方便提取日期和小时
hourly_df['time'] = pd.to_datetime(hourly_df['time'])
hourly_df['date'] = hourly_df['time'].dt.date
hourly_df['hour'] = hourly_df['time'].dt.hour
  1. 按日期和小时重塑为宽格式(以shortwave_radiation为例):
# 单指标宽表:每行是一个日期,列是0-23小时的辐射值
wide_format_single = hourly_df.pivot(
    index='date',
    columns='hour',
    values='shortwave_radiation'
).rename_axis(columns=None).reset_index()

如果需要同时包含所有辐射指标,可以用多列pivot:

# 多指标宽表:列是(辐射指标,小时)的层级结构
wide_format_multi = hourly_df.pivot(
    index='date',
    columns=['hour'],
    values=['shortwave_radiation', 'direct_radiation', 'diffuse_radiation', 'direct_normal_irradiance', 'terrestrial_radiation']
)
# 也可以将层级列展开为"指标_小时"的格式
wide_format_multi.columns = wide_format_multi.columns.map(lambda x: f"{x[0]}_{x[1]}")
wide_format_multi = wide_format_multi.reset_index()

内容的提问来源于stack exchange,提问作者Tobias Riepe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:29:54