如何用Python的Meteostat库抓取多地点天气数据及解决报错
解决Meteostat中AttributeError: 'Series' object has no attribute 'fetch'的问题
你的错误出在data = data.fetch()这一行——df.apply(...)返回的是一个Pandas Series,其中每个元素是Meteostat的Daily对象,而fetch()是Daily实例的方法,不能直接在Series对象上调用。
需要对每个Daily实例单独调用fetch(),再将所有地点的天气数据合并到一个DataFrame中。以下是两种可行的实现方式:
方法一:在apply中直接获取并处理数据
import pandas as pd from datetime import datetime from meteostat import Point, Daily # 原始数据集 df = pd.DataFrame({ 'postal code': [11, 12, 13], 'latitude': [40.7128, 34.0522, 51.5074], 'longitude': [-74.0060, -118.2437, -0.1278] }) # 设置时间范围 start = datetime(2022, 1, 1) end = datetime(2022, 12, 31) def fetch_location_data(row): # 创建地点Point point = Point(row['latitude'], row['longitude'], 70) # 获取该地点的每日天气数据 daily_df = Daily(point, start, end).fetch() # 添加邮编列,标记数据所属地点 daily_df['postal code'] = row['postal code'] return daily_df # 对每个地点应用函数,得到包含多个DataFrame的Series location_dfs = df.apply(fetch_location_data, axis=1) # 合并所有地点的数据 final_weather_data = pd.concat(location_dfs.to_list()) # 查看结果(仅展示关键列) print(final_weather_data[['postal code', 'tmax', 'tmin']].head())
方法二:用循环遍历每个地点
如果你更习惯循环写法,也可以这样实现:
import pandas as pd from datetime import datetime from meteostat import Point, Daily df = pd.DataFrame({ 'postal code': [11, 12, 13], 'latitude': [40.7128, 34.0522, 51.5074], 'longitude': [-74.0060, -118.2437, -0.1278] }) start = datetime(2022, 1, 1) end = datetime(2022, 12, 31) final_weather_data = pd.DataFrame() for _, row in df.iterrows(): point = Point(row['latitude'], row['longitude'], 70) daily_df = Daily(point, start, end).fetch() daily_df['postal code'] = row['postal code'] final_weather_data = pd.concat([final_weather_data, daily_df])
关键说明
- 两种方法都会给每个地点的天气数据添加
postal code列,方便后续区分不同地点的数据 tmax和tmin列分别对应每日最高气温和最低气温,符合你的需求
内容的提问来源于stack exchange,提问作者just_learning
相关产品推荐
相关产品推荐

