如何用循环结合df.query批量处理经纬度点日均值并导出CSV
批量处理经纬度点的O3数据日均值并导出CSV
问题背景
我有一个维度为(17,11)的矩阵数据,每个经纬度点(longitude为X轴,latitude为Y轴)每日包含9条O3数据。需要针对每一组经纬度对应的数据筛选存入DataFrame,按日重采样计算均值后导出为CSV文件。
已掌握单条处理的代码:
dl_1=d.query('longitude==-55 and latitude==-18.5') daily_resampled_data_1 = dl_1.resample('D').mean() daily_resampled_data_1.to_csv('CAMS_ponto1_O3.csv') daily_resampled_data_1
尝试用循环简化但写法存在问题,原始循环雏形:
latitudes = [-18.5, -19.25, -20.0, -20.75, -21.5, -22.25, -23.0, -23.75, -24.5, -25.25,-26.0] longitudes = [-55.0, -54.25, -53.5, -52.75, -52.0, -51.25, -50.5, -49.75, -49.0, -48.25, 47.5, -46.75, -46.0, -45.25, -44.5, -43.75, -43.0] for x in latitude: for y in longitude: dl_[x][y]=d.query('longitude==[x] and latitude==[y]') daily_resampled_data_[x][y] = dl_[x][y].resample('D').mean() daily_resampled_data_[x][y].to_csv('CAMS_ponto[x][y]_O3.csv')
需要确认该实现是否可行,并得到正确的循环写法。
原始代码的问题
- 变量名错误:
latitude/longitude应为定义好的latitudes/longitudes df.query语法错误:不能用[x]引用变量,需用字符串拼接或f-string传递变量值- 无需嵌套字典存储临时DataFrame,直接处理导出更节省内存
- 文件名拼接错误:字符串内无法直接解析
[x][y],需用格式化语法生成文件名
修正后的可行代码
import pandas as pd # 定义经纬度列表 latitudes = [-18.5, -19.25, -20.0, -20.75, -21.5, -22.25, -23.0, -23.75, -24.5, -25.25, -26.0] longitudes = [-55.0, -54.25, -53.5, -52.75, -52.0, -51.25, -50.5, -49.75, -49.0, -48.25, 47.5, -46.75, -46.0, -45.25, -44.5, -43.75, -43.0] # 确保数据框索引为时间类型(重采样必备) # 若有单独时间列,先执行以下两行: # d['timestamp'] = pd.to_datetime(d['timestamp']) # d.set_index('timestamp', inplace=True) # 遍历所有经纬度组合 for lat in latitudes: for lon in longitudes: # 方式1:使用df.query筛选数据 dl = d.query(f'longitude == {lon} and latitude == {lat}') # 方式2:布尔索引(处理浮点数精度问题更可靠) # dl = d[(d['longitude'] == lon) & (d['latitude'] == lat)] # 跳过空数据,避免报错 if dl.empty: print(f"No data for lon={lon}, lat={lat}, skipping...") continue # 按日重采样计算均值 daily_resampled = dl.resample('D').mean() # 生成规范文件名,替换负号为下划线 filename = f'CAMS_ponto_lat{lat}_lon{lon}_O3.csv'.replace('-', '_') # 导出CSV daily_resampled.to_csv(filename) print(f"Saved: {filename}")
关键注意事项
- 时间索引要求:
resample('D')必须依赖时间类型索引,若数据中是单独的时间列,需先转为datetime并设置为索引。 - 空数据处理:加入
if dl.empty判断,避免无数据时后续操作抛出异常。 - 浮点数精度:若经纬度为浮点型,存在精度误差时,可改用
np.isclose替代直接等于判断,例如:dl = d[np.isclose(d['longitude'], lon) & np.isclose(d['latitude'], lat)]。
内容的提问来源于stack exchange,提问作者Daniel M M
相关产品推荐
相关产品推荐

