前段时间NASA的API更新了,修改了一些参数,现在重新上线。

NASA有专门为作物生长模型提供的气象数据,主要包括辐射、温度、降雨、风速。其分辨率为0.5度,通过输入经纬度和时间段获取数据。
获取数据的基本函数(可以不用看)
主要修改main函数里的
start_date = dt.date(2000,1,1)
end_date = dt.date(2020,2,2)
latitude=34.5
longitude=112.5
四个参数,输出的结果是Excel可以直接被WOFOST模型读取,其中空值用了前后5日的平均值代替。

# 获取数据的基础函数
import pandas as pd
import numpy as np
import requests
import datetime as dt
from math import expMJ_to_KJ = lambda x: x * 1e3
mm_to_cm = lambda x: x / 10.
tdew_to_kpa = lambda x: ea_from_tdew(x) / 10 * 10.
to_date = lambda d: d.date()def getnasadata(latitude, longitude, start_date, end_date):server = "https://power.larc.nasa.gov/api/temporal/daily/point"# Variable names in POWER datapower_variables = ["TOA_SW_DWN", "ALLSKY_SFC_SW_DWN", "T2M", "T2M_MIN","T2M_MAX", "T2MDEW", "WS2M", "PRECTOTCORR"]payload = {"request": "execute","parameters": ",".join(power_variables),"latitude": latitude,"longitude": longitude,"start": start_date.strftime("%Y%m%d"),"end": end_date.strftime("%Y%m%d"),"community": "AG","format": "JSON","user": "anonymous"}req = requests.get(server, params=payload)return req.json()def _process_POWER_records(powerdata):"""Process the meteorological records returned by NASA POWER"""fill_value = float(powerdata["header"]["fill_value"])power_variables = ["TOA_SW_DWN", "ALLSKY_SFC_SW_DWN", "T2M", "T2M_MIN","T2M_MAX", "T2MDEW", "WS2M", "PRECTOTCORR"]df_power = {}for varname in power_variables:s = pd.Series(powerdata["properties"]["parameter"][varname])s[s == fill_value] = np.NaNdf_power[varname] = sdf_power = pd.DataFrame(df_power)df_power["DAY"] = pd.to_datetime(df_power.index, format="%Y%m%d")# find all rows with one or more missing values (NaN)ix = df_power.isnull().any(axis=1)# Get all rows without missing valuesdf_power = df_power[~ix]return df_powerdef _estimate_AngstAB(df_power):"""Determine Angstrom A/B parameters from Top-of-Atmosphere (ALLSKY_TOA_SW_DWN) andtop-of-Canopy (ALLSKY_SFC_SW_DWN) radiation values.:param df_power: dataframe with POWER data:return: tuple of Angstrom A/B valuesThe Angstrom A/B parameters are determined by dividing swv_dwn by toa_dwnand taking the 0.05 percentile for Angstrom A and the 0.98 percentile forAngstrom A+B: toa_dwn*(A+B) approaches the upper envelope whiletoa_dwn*A approaches the lower envelope of the records of swv_dwnvalues."""# check if sufficient data is available to make a reasonable estimate:# As a rule of thumb we want to have at least 200 days availableangstA = 0.29angstB = 0.49if len(df_power) < 200:msg = ("Less then 200 days of data available. Reverting to " +"default Angstrom A/B coefficients (%f, %f)")print(msg)return angstA, angstB# calculate relative radiation (swv_dwn/toa_dwn) and percentilesrelative_radiation = df_power.ALLSKY_SFC_SW_DWN / df_power.TOA_SW_DWNix = relative_radiation.notnull()angstrom_a = float(np.percentile(relative_radiation[ix].values, 5))angstrom_ab = float(np.percentile(relative_radiation[ix].values, 98))angstrom_b = angstrom_ab - angstrom_aMIN_A = 0.1MAX_A = 0.4MIN_B = 0.3MAX_B = 0.7MIN_SUM_AB = 0.6MAX_SUM_AB = 0.9A = abs(angstrom_a)B = abs(angstrom_b)SUM_AB = A + Bif A < MIN_A or A > MAX_A or B < MIN_B or B > MAX_B or SUM_AB < MIN_SUM_AB or SUM_AB > MAX_SUM_AB:msg = ("Angstrom A/B values (%f, %f) outside valid range " +"Reverting to default values.")msg = msg % (angstrom_a, angstrom_b)print(msg)return angstA, angstBreturn angstrom_a, angstrom_bdef _POWER_to_PCSE(df_power):# Convert POWER data to a dataframe with PCSE compatible inputsdf_pcse = pd.DataFrame({"DAY": df_power.DAY.apply(to_date),"IRRAD": df_power.ALLSKY_SFC_SW_DWN.apply(MJ_to_KJ),"TMIN": df_power.T2M_MIN,"TMAX": df_power.T2M_MAX,"VAP": df_power.T2MDEW.apply(tdew_to_kpa),"WIND": df_power.WS2M,"RAIN": df_power.PRECTOTCORR})return df_pcsedef ea_from_tdew(tdew):# Raise exception:if (tdew < -95.0 or tdew > 65.0):# Are these reasonable bounds?msg = 'tdew=%g is not in range -95 to +60 deg C' % tdewraise ValueError(msg)tmp = (17.27 * tdew) / (tdew + 237.3)ea = 0.6108 * exp(tmp)return ea# 单点获取
def main():start_date = dt.date(2000, 1, 1)end_date = dt.date(2020, 2, 2)latitude = 35.5longitude = 112.5powerdata = getnasadata(latitude, longitude, start_date, end_date)if not powerdata:msg = "Failure retrieving POWER data from server. This can be a connection problem with " \"the NASA POWER server, retry again later."print(msg)description = [powerdata["header"]["title"]]elevation = float(powerdata["geometry"]["coordinates"][2])df_power = _process_POWER_records(powerdata)# Determine Angstrom A/B parametersangstA, angstB = _estimate_AngstAB(df_power)# Convert power records to PCSE compatible structuredf_pcse = _POWER_to_PCSE(df_power)# 去除空值,填充空值,加上降雪SNOWDEPTH = [-999 for i in range((end_date - start_date).days + 1)]std_datatime = pd.DataFrame(pd.date_range(start=start_date, end=end_date, freq='D'), columns=['DAY'])data = df_pcse.dropna()data['DAY'] = pd.to_datetime(data['DAY'])result = pd.merge(std_datatime, data, how='left', on='DAY')result['SNOWDEPTH'] = SNOWDEPTH# 找出缺失值索引nan_indexset = set(np.where(np.isnan(result.iloc[:, 1:]))[0])nan_index = list(nan_indexset)miss_value = len(nan_index)nan_index.sort()# 替换空值for i in nan_index:result.loc[i, 'IRRAD'] = result.iloc[i - 5:i + 6, 1].mean()result.loc[i, 'TMIN'] = result.iloc[i - 5:i + 6, 2].mean()result.loc[i, 'TMAX'] = result.iloc[i - 5:i + 6, 3].mean()result.loc[i, 'VAP'] = result.iloc[i - 5:i + 6, 4].mean()result.loc[i, 'WIND'] = result.iloc[i - 5:i + 6, 5].mean()result.loc[i, 'RAIN'] = result.iloc[i - 5:i + 6, 6].mean()# 写文件表头excelhead = pd.DataFrame({'DAY': ['Site Characteristics', 'Country', 'Station', 'Description', 'Source', 'Contact','Missing values', 'Longitude', longitude, 'Observed data', 'DAY', 'date'],'IRRAD': [np.NaN, 'China', 'miss_value={}days'.format(miss_value), description,'Meteorology and Air Quality Group, Wageningen University', 'Peter Uithol',-999, 'Latitude', latitude, np.NaN, 'IRRAD', 'kJ/m2/day or hours'],'TMIN': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 'Elevation', elevation,np.NaN, 'TMIN', 'Celsius'],'TMAX': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 'AngstromA', angstA,np.NaN, 'TMAX', 'Celsius'],'VAP': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 'AngstromB', angstB,np.NaN, 'VAP', 'kPa'],'WIND': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, 'HasSunshine', False,np.NaN, 'WIND', 'm/sec'],'RAIN': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN,'RAIN', 'mm'],'SNOWDEPTH': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN,np.NaN, 'SNOWDEPTH', 'cm']})dataexcel = pd.concat([excelhead, result], axis=0, ignore_index=True)dataexcel.to_excel(r'C:\Users\Administrator\Desktop\NASA天气文件lat={},lon={}.xlsx'.format(latitude, longitude),index=False, header=None)print('getNASA天气文件lat={},lon={}.xlsx successful'.format(latitude, longitude))if __name__ == '__main__':main()

参考资料

[1] https://github.com/ajwdewit/pcse/tree/master/pcse

从NASA获取全球气象数据相关推荐

  1. 如何免费获取县级气象数据?

    建议用卫星数据,基本上0.5×0.5的精度完全能满足要求. 所谓0.5×0.5就是指全球每间隔0.5经纬度设置一个网格点.根据陆地面积可以推算出约有3000多个格点落在中国大陆,而中国一共有2854个 ...

  2. 全球气象数据下载总结-CRU数据,ERA数据NCEP-2数据

    一.CRU数据下载 CRU数据官网 官网链接 CRU数据下载链接 我下载的是CRU TS v.4.03的数据,该数据覆盖全球陆地范围,各参数每月得一个平均值. 点击Local Copy进入数据下载界面 ...

  3. 1901年-2020年全球气象数据 CRU TS 介绍、下载与使用教程

    数据介绍 CRU TS 是目前使用最广泛的气候数据集之一,由英国国家大气科学中心 (NCAS) 制作.CRU TS 提供全球1901 年至 2020 年覆盖陆地表面的 0.5° 分辨率的月度数据.该数 ...

  4. 全球气象数据下载链接 Climatic Research Unit (CRU) 和MERRA-2

    目录 (一)气象数据集(CRU) (二)气象数据集(European Climate Assessment & Dataset) (三)气象数据集(MERRA-2) (一)气象数据集(CRU) ...

  5. 全球气象数据下载-ERA5数据

    ERA5数据下载 ERA5数据是在ERA-Interim数据之后的新数据库,时间跨度1981年-至今,分辨率0.1°.数据库包含月均数据和日尺度数据. ERA5数据链接 文章目录 ERA5数据下载 一 ...

  6. 遥感数据、气象数据、土地土壤数据、农业数据、行政区数据...GIS数据获取网站整理

      本文对GIS行业相关的综合数据获取网站加以整理,包括但不限于遥感数据.气候数据.土地数据.土壤数据.农业数据.行政区数据.社会数据.经济数据等.数据较多,大家可以直接通过下方目录加以总览:点击数据 ...

  7. NCDC气象数据的提取与处理(一):获取站点列表

    目录 1.站点查询 2.下载站点列表 方法1 方法2 3.站点筛选 NCDC气象数据的下载可以参考:http://t.csdn.cn/ZBQJh 如果只想获取研究区域内的站点,同时又对站点观测起止时间 ...

  8. Arduino ESP32 通过getString方法获取网络时间和气象数据

    Arduino ESP32-通过getString方法获取网络时间和气象数据 国家气象数据API接口:http://www.weather.com.cn/data/sk/101010100.html ...

  9. MeteoInfoLab脚本示例:获取气团轨迹每个节点的气象数据

    读取HYSPLIT输出的轨迹数据文件和相应时间的气象数据文件,生成轨迹图层,循环每条轨迹的节点,读出该节点的经度.纬度.气压.时间,通过对气象数据插值获得该节点的气象数据. 脚本程序: #------ ...

  10. 用python获取气象数据开放平台信息

    缘由 前端时间在练手做一个Android天气预报的App,然后就去找现有的公共API,发现找到的大部分的网址都是 失效的,最后发现了 聚合数据 和 气象数据开放平台, 由于感觉后者的操作优点麻烦,所以 ...

最新文章

  1. 损失函数的意义和作用_哈佛CASTER | 基于化学子结构表征预测药物相互作用
  2. C# 函数重载 示例 求圆的面积
  3. Python基础day08【面向对象(类、对象、属性)、魔方方法(init、str、del、repr)】
  4. URL与URI的不同
  5. 京东笔试4.2-19:00随笔
  6. 2019-08-01 纪中NOIP模拟赛B组
  7. 修改npm安装的全局路径和配置环境变量的坑
  8. 值得收藏的数据库基础总结!
  9. python123测验答案第二周温度转换二_python123练习题
  10. 职场 PUA 你知多少?
  11. SQLServer2016安装教程
  12. c++ 中——fatal error: opencv2/opencv.hpp: No such file or directory #include <opencv2/opencv.hpp>
  13. win7万能声卡驱动_黑苹果AppleALC声卡驱动教程详解
  14. 在mysql中unique唯一索引的作用_mysql唯一索引和unique
  15. linux环境下,实现公共聊天室功能
  16. hp ux安装mysql5.1.56_详细讲解Linux环境下MySQL5.1安装步骤
  17. linux中的fs文件夹,linux上使用eCryptFS加密文件夹的方法
  18. jpg怎么合成一份_如何将多张JPG图片合并成一个GIF?
  19. AI中怎么给文字加粗
  20. 读取和讯博客数据可视化分析

热门文章

  1. 利用Sen2cor工具对哨兵2影像进行大气校正和辐射校正
  2. lammps教程:EAM势函数设置详解
  3. plsqldevelop破解方法
  4. D1、D系列分辨率是多少
  5. 飞机大战一Java课程设计
  6. 《Unity3d脚本编程 使用C#语言开发跨平台游戏》读书笔记2
  7. 编程新手导论(转载)
  8. pygarm windows 安装_飘云阁(PYG官方) Windows PowerShell实战指南(第2版)PDF - Powered by Discuz!...
  9. 20220626-JAVA高德地图天气API调用总结
  10. [AHK]从QQ音乐网站下载歌曲