PCSE_NASA【wofost】 天气数据获取(5.5新版本)
生活随笔
收集整理的這篇文章主要介紹了
PCSE_NASA【wofost】 天气数据获取(5.5新版本)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
PCSE_NASA 天氣數(shù)據(jù)獲取(5.5新版本)
之前有個(gè)河南農(nóng)大的哥們寫了一個(gè),但是現(xiàn)在NASA接口更新了,然后我隨便改了一下好像是能用了,就是作者里面又加了幾條數(shù)據(jù)【平均溫度、經(jīng)緯度、海拔】總輻射量單位發(fā)生了變化,作者把單位從千焦變成了焦,不知道再5.5的版本里面是否有對(duì)應(yīng)修改
# 獲取數(shù)據(jù)的基礎(chǔ)函數(shù) import pandas as pd import numpy as np import requests import datetime as dt from math import exp import json import time# 1.公式單位轉(zhuǎn)換 MJ_to_J = lambda x: x * 1e6 mm_to_cm = lambda x: x / 10. tdew_to_hpa = lambda x: ea_from_tdew(x) * 10. to_date = lambda d: d.date()# 2.接口調(diào)用設(shè)定經(jīng)緯與時(shí)間 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() # 或者 req.json()# 3.處理并返回氣象記錄 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]print(df_power.ALLSKY_SFC_SW_DWN)return df_powerdef _estimate_AngstAB(df_power):relative_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_areturn angstrom_a, angstrom_bdef 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# 單點(diǎn)獲取 def main():start_date = dt.date(2019, 1, 1)end_date = dt.date(2021, 10, 24)latitude = 40.5longitude = 81.2powerdata = getnasadata(latitude, longitude, start_date, end_date)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 = pd.DataFrame({"TMAX": df_power.T2M_MAX,"TMIN": df_power.T2M_MIN,"TEMP": df_power.T2M,"IRRAD": df_power.ALLSKY_SFC_SW_DWN.apply(MJ_to_J),"RAIN": df_power.PRECTOTCORR.apply(mm_to_cm),"WIND": df_power.WS2M,"VAP": df_power.T2MDEW.apply(tdew_to_hpa),"DAY": df_power.DAY.apply(to_date),"LAT": latitude,"LON": longitude,"ELEV": elevation})# 去除空值,填充空值,加上降雪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()result.loc[i, 'TEMP'] = result.iloc[i - 5:i + 6, 7].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', 'J/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'],'TEMP': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN,np.NaN, 'TEMP', 'Celsius'],'LAT': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN,np.NaN, 'LAT',''],'LON': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN,np.NaN, 'LON',''],'ELEV': [np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN,np.NaN, 'ELEV','']})dataexcel = pd.concat([excelhead, result], axis=0, ignore_index=True)dataexcel.to_excel(r'D:\nASA天氣文件lat={},lon={}.xlsx'.format(latitude, longitude),index=False, header=None)print('getNASA天氣文件lat={},lon={}.xlsx successful'.format(latitude, longitude))if __name__ == '__main__':main()關(guān)鍵參數(shù)還是那幾個(gè)
start_date = dt.date(2019, 1, 1)end_date = dt.date(2021, 10, 24)latitude = 40.5longitude = 81.2原文連接:https://www.pythonf.cn/read/57365
總結(jié)
以上是生活随笔為你收集整理的PCSE_NASA【wofost】 天气数据获取(5.5新版本)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Y 老师的乐高小镇
- 下一篇: 基于ARM Cortex M0国产32位