增加对大数据云平台的探空数据的读取.

This commit is contained in:
NMC-DAVE 2022-06-02 00:13:27 +08:00
parent 96af87195a
commit deff6c5c56
2 changed files with 377 additions and 2 deletions

@ -4,4 +4,4 @@ from various data sources.
"""
__author__ = "The R & D Center for Weather Forecasting Technology in NMC, CMA"
__version__ = '0.1.9.3'
__version__ = '0.1.10.0'

@ -249,7 +249,7 @@ def cmadaas_get_obs_files(times, data_code="SURF_CMPA_RT_NC", out_dir=None, pbar
def cmadaas_obs_by_time(times, data_code="SURF_CHN_MUL_HOR_N",
sta_levels=None, ranges=None, order=None,
count=None, distinct=False, trans_type=True,
count=None, distinct=False, trans_type=True,
elements="Station_Id_C,Station_Id_d,lat,lon,Datetime,TEM"):
"""
Retrieve station records from CMADaaS by times.
@ -1498,6 +1498,381 @@ def cmadaas_obs_by_years(data_code="SURF_CHN_YER_MMUT_19812010",
return data
def cmadaas_get_sounding_latest_time(data_code="UPAR_CHN_MUL_FTM", latestTime=24):
"""
Get the latest time of the soundings.
Args:
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
latestTime (int, optional): latestTime > 0, like 2 is return
the latest time in 2 hours. Defaults to 12.
Returns:
datetime object, the latest time
Examples:
>>> print(cmadaas_get_sounding_latest_time())
2020-03-12 03:00:00
"""
# set retrieve parameters
params = {'dataCode': data_code,
'latestTime': str(latestTime+8)} # 由于服务器是世界时, 因此需要+8才能与当前时间比较.
# interface id
interface_id = "getUparLatestTime"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
time = pd.to_datetime(data['Datetime'], format="%Y%m%d%H%M%S")
return time[0]
def cmadaas_sounding_by_time(times, data_code="UPAR_CHN_MUL_FTM", ranges=None,
order=None, count=None, distinct=False, trans_type=True,
elements="Station_Name,Station_Id_C,Lat,Lon,Alti,Year,Mon,Day,Hour,Min,Second,PRS_HWC,GPH,TEM,DPT,DTD,WIN_D"):
"""
Retrieve sounding records from CMADaaS by times.
Args:
times (str): times for retrieve, 'YYYYMMDDHHMISS,YYYYMMDDHHMISS,...'
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
ranges (str, optional): elements value ranges, seperated by ';'
range: (a,) is >a, [a,) is >=a, (,a) is <a, (,a] is <=a, (a,b) is >a & <b,
[a,b) is >=a & <b, (a,b] is >a & <=b, [a,b] is >=a & <=b
list: a,b,c;
e.g., "VIS:(,1000);RHU:(70,)", "Q_PRE_1h:0,3,4" is PRE quantity is credible.. Defaults to None.
order (str, optional): elements order, seperated by ',', like
"TEM:asc,SUM_PRE_1h:desc" is ascending order temperature first and descending PRE_1h. Defaults to None.
count (int, optional): the number of maximum returned records. Defaults to None.
distinct (bool, optional): return unique records. Defaults to False.
trans_type (bool, optional): transform the return data frame's column type to datetime, numeric. Defaults to True.
elements (str, optional): elements for retrieve, 'ele1,ele2,...'.
Returns:
pandas data frame: sounding records.
Examples:
uparData = cmadaas_sounding_by_time('20220531000000')
"""
# set retrieve parameters
params = {'dataCode': data_code,
'times': times,
'orderby': order if order is not None else "Datetime:ASC",
'elements': elements}
if ranges is not None: params['eleValueRanges'] = ranges
if count is not None: params['limitCnt'] = str(count)
if distinct: params['distinct'] = "true"
# Interface, refer to
interface_id = "getUparEleByTime"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
if contents is None:
return None
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
if trans_type: data = cmadaas_obs_convert_type(data)
# return
return data
def cmadaas_sounding_by_time_and_press(
times, data_code="UPAR_CHN_MUL_FTM", press=500, ranges=None,
order=None, count=None, distinct=False, trans_type=True,
elements="Station_Name,Station_Id_C,Lat,Lon,Alti,Year,Mon,Day,Hour,Min,Second,PRS_HWC,GPH,TEM,DPT,DTD,WIN_D"):
"""
Retrieve sounding records from CMADaaS by times.
Args:
times (str): times for retrieve, 'YYYYMMDDHHMISS,YYYYMMDDHHMISS,...'
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
press (str, optional): pressure level. Defaults to 500.
ranges (str, optional): elements value ranges, seperated by ';'
range: (a,) is >a, [a,) is >=a, (,a) is <a, (,a] is <=a, (a,b) is >a & <b,
[a,b) is >=a & <b, (a,b] is >a & <=b, [a,b] is >=a & <=b
list: a,b,c;
e.g., "VIS:(,1000);RHU:(70,)", "Q_PRE_1h:0,3,4" is PRE quantity is credible.. Defaults to None.
order (str, optional): elements order, seperated by ',', like
"TEM:asc,SUM_PRE_1h:desc" is ascending order temperature first and descending PRE_1h. Defaults to None.
count (int, optional): the number of maximum returned records. Defaults to None.
distinct (bool, optional): return unique records. Defaults to False.
trans_type (bool, optional): transform the return data frame's column type to datetime, numeric. Defaults to True.
elements (str, optional): elements for retrieve, 'ele1,ele2,...'.
Returns:
pandas data frame: sounding records.
Examples:
uparData = cmadaas_sounding_by_time_and_press('20220531000000', press=500)
"""
# set retrieve parameters
params = {'dataCode': data_code,
'times': times,
'pLayers': str(press).strip(),
'orderby': order if order is not None else "Datetime:ASC",
'elements': elements}
if ranges is not None: params['eleValueRanges'] = ranges
if count is not None: params['limitCnt'] = str(count)
if distinct: params['distinct'] = "true"
# Interface, refer to
interface_id = "getUparEleByTimeAndPress"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
if contents is None:
return None
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
if trans_type: data = cmadaas_obs_convert_type(data)
# return
return data
def cmadaas_sounding_by_time_and_height(
times, data_code="UPAR_CHN_MUL_FTM", height=5000, ranges=None,
order=None, count=None, distinct=False, trans_type=True,
elements="Station_Name,Station_Id_C,Lat,Lon,Alti,Year,Mon,Day,Hour,Min,Second,PRS_HWC,GPH,TEM,DPT,DTD,WIN_D"):
"""
Retrieve sounding records from CMADaaS by times.
Args:
times (str): times for retrieve, 'YYYYMMDDHHMISS,YYYYMMDDHHMISS,...'
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
height (str, optional): height level. Defaults to 5000.
ranges (str, optional): elements value ranges, seperated by ';'
range: (a,) is >a, [a,) is >=a, (,a) is <a, (,a] is <=a, (a,b) is >a & <b,
[a,b) is >=a & <b, (a,b] is >a & <=b, [a,b] is >=a & <=b
list: a,b,c;
e.g., "VIS:(,1000);RHU:(70,)", "Q_PRE_1h:0,3,4" is PRE quantity is credible.. Defaults to None.
order (str, optional): elements order, seperated by ',', like
"TEM:asc,SUM_PRE_1h:desc" is ascending order temperature first and descending PRE_1h. Defaults to None.
count (int, optional): the number of maximum returned records. Defaults to None.
distinct (bool, optional): return unique records. Defaults to False.
trans_type (bool, optional): transform the return data frame's column type to datetime, numeric. Defaults to True.
elements (str, optional): elements for retrieve, 'ele1,ele2,...'.
Returns:
pandas data frame: sounding records.
Examples:
uparData = cmadaas_sounding_by_time_and_height('20220531000000', height=5000)
"""
# set retrieve parameters
params = {'dataCode': data_code,
'times': times,
'hLayers': str(height).strip(),
'orderby': order if order is not None else "Datetime:ASC",
'elements': elements}
if ranges is not None: params['eleValueRanges'] = ranges
if count is not None: params['limitCnt'] = str(count)
if distinct: params['distinct'] = "true"
# Interface, refer to
interface_id = "getUparEleByTimeAndHeight"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
if contents is None:
return None
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
if trans_type: data = cmadaas_obs_convert_type(data)
# return
return data
def cmadaas_sounding_in_rect_by_time(
times, limit=[3.51, 73.33, 53.33, 135.05], data_code="UPAR_CHN_MUL_FTM",
ranges=None, order=None, count=None, trans_type=True,
elements="Station_Name,Station_Id_C,Lat,Lon,Alti,Year,Mon,Day,Hour,Min,Second,PRS_HWC,GPH,TEM,DPT,DTD,WIN_D,WIN_S"):
"""
Retrieve sounding records from CIMISS in region by times.
Args:
times (str): time for retrieve, 'YYYYMMDDHHMISS,YYYYMMDDHHMISS,...'
limit (list, optional): map limits, [min_lat, min_lon, max_lat, max_lon]
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
ranges (str, optional): elements value ranges, seperated by ';'
range: (a,) is >a, [a,) is >=a, (,a) is <a, (,a] is <=a, (a,b) is >a & <b,
[a,b) is >=a & <b, (a,b] is >a & <=b, [a,b] is >=a & <=b
list: a,b,c;
e.g., "VIS:(,1000);RHU:(70,)", "Q_PRE_1h:0,3,4" is PRE quantity is credible.. Defaults to None.
order (str, optional): elements order, seperated by ',', like
"TEM:asc,SUM_PRE_1h:desc" is ascending order temperature first and descending PRE_1h. Defaults to None.
count (int, optional): the number of maximum returned records. Defaults to None.
trans_type (bool, optional): transform the return data frame's column type to datetime, numeric. Defaults to True.
elements (str, optional): elements for retrieve, 'ele1,ele2,...'.
Returns:
pandas data frame: sounding records.
Examples:
>>> data = cmadaas_sounding_in_rect_by_time('20220531000000', limit=[3.51, 73.33, 53.33, 135.05])
"""
# set retrieve parameters
params = {'dataCode': data_code,
'elements': elements,
'times': times,
'minLat': '{:.10f}'.format(limit[0]),
'minLon': '{:.10f}'.format(limit[1]),
'maxLat': '{:.10f}'.format(limit[2]),
'maxLon': '{:.10f}'.format(limit[3]),
'orderby': order if order is not None else "Datetime:ASC"}
if ranges is not None: params['eleValueRanges'] = ranges
if count is not None: params['limitCnt'] = str(count)
# interface id
interface_id = "getUparEleInRectByTime"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
if contents is None:
return None
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
if trans_type: data = cmadaas_obs_convert_type(data)
# return
return data
def cmadaas_sounding_by_time_and_id(
times, data_code="UPAR_CHN_MUL_FTM", sta_ids='54511', ranges=None,
order=None, count=None, distinct=False, trans_type=True,
elements="Station_Name,Station_Id_C,Lat,Lon,Alti,Year,Mon,Day,Hour,Min,Second,PRS_HWC,GPH,TEM,DPT,DTD,WIN_D"):
"""
Retrieve sounding records from CMADaaS by times.
Args:
times (str): times for retrieve, 'YYYYMMDDHHMISS,YYYYMMDDHHMISS,...'
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
sta_ids (str, optional): station id, 多个以逗号(,)分隔区域站以字母开头. Defaults to 54511.
ranges (str, optional): elements value ranges, seperated by ';'
range: (a,) is >a, [a,) is >=a, (,a) is <a, (,a] is <=a, (a,b) is >a & <b,
[a,b) is >=a & <b, (a,b] is >a & <=b, [a,b] is >=a & <=b
list: a,b,c;
e.g., "VIS:(,1000);RHU:(70,)", "Q_PRE_1h:0,3,4" is PRE quantity is credible.. Defaults to None.
order (str, optional): elements order, seperated by ',', like
"TEM:asc,SUM_PRE_1h:desc" is ascending order temperature first and descending PRE_1h. Defaults to None.
count (int, optional): the number of maximum returned records. Defaults to None.
distinct (bool, optional): return unique records. Defaults to False.
trans_type (bool, optional): transform the return data frame's column type to datetime, numeric. Defaults to True.
elements (str, optional): elements for retrieve, 'ele1,ele2,...'.
Returns:
pandas data frame: sounding records.
Examples:
uparData = cmadaas_sounding_by_time_and_id('20220531000000', sta_ids='54511')
"""
# set retrieve parameters
params = {'dataCode': data_code,
'times': times,
'staIds': str(sta_ids).strip(),
'orderby': order if order is not None else "Datetime:ASC",
'elements': elements}
if ranges is not None: params['eleValueRanges'] = ranges
if count is not None: params['limitCnt'] = str(count)
if distinct: params['distinct'] = "true"
# Interface, refer to
interface_id = "getUparEleByTimeAndStaID"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
if contents is None:
return None
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
if trans_type: data = cmadaas_obs_convert_type(data)
# return
return data
def cmadaas_sounding_in_rect_by_time_range(
time_range, limit=[3.51, 73.33, 53.33, 135.05], data_code="UPAR_CHN_MUL_FTM",
ranges=None, order=None, count=None, trans_type=True,
elements="Station_Name,Station_Id_C,Lat,Lon,Alti,Year,Mon,Day,Hour,Min,Second,PRS_HWC,GPH,TEM,DPT,DTD,WIN_D,WIN_S"):
"""
Retrieve sounding records from CIMISS in region by times.
Args:
time_range (str): time for retrieve, "[YYYYMMDDHHMISS,YYYYMMDDHHMISS]"
limit (list, optional): map limits, [min_lat, min_lon, max_lat, max_lon]
data_code (str, optional): dataset code. Defaults to "UPAR_CHN_MUL_FTM".
ranges (str, optional): elements value ranges, seperated by ';'
range: (a,) is >a, [a,) is >=a, (,a) is <a, (,a] is <=a, (a,b) is >a & <b,
[a,b) is >=a & <b, (a,b] is >a & <=b, [a,b] is >=a & <=b
list: a,b,c;
e.g., "VIS:(,1000);RHU:(70,)", "Q_PRE_1h:0,3,4" is PRE quantity is credible.. Defaults to None.
order (str, optional): elements order, seperated by ',', like
"TEM:asc,SUM_PRE_1h:desc" is ascending order temperature first and descending PRE_1h. Defaults to None.
count (int, optional): the number of maximum returned records. Defaults to None.
trans_type (bool, optional): transform the return data frame's column type to datetime, numeric. Defaults to True.
elements (str, optional): elements for retrieve, 'ele1,ele2,...'.
Returns:
pandas data frame: sounding records.
Examples:
>>> data = cmadaas_sounding_in_rect_by_time_range('[20220531000000,20220531010000]', limit=[3.51, 73.33, 53.33, 135.05])
"""
# set retrieve parameters
params = {'dataCode': data_code,
'elements': elements,
'timeRange': time_range,
'minLat': '{:.10f}'.format(limit[0]),
'minLon': '{:.10f}'.format(limit[1]),
'maxLat': '{:.10f}'.format(limit[2]),
'maxLon': '{:.10f}'.format(limit[3]),
'orderby': order if order is not None else "Datetime:ASC"}
if ranges is not None: params['eleValueRanges'] = ranges
if count is not None: params['limitCnt'] = str(count)
# interface id
interface_id = "getUparEleInRectByTimeRange"
# retrieve data contents
contents = get_rest_result(interface_id, params)
contents = _load_contents(contents)
if contents is None:
return None
# construct pandas DataFrame
data = pd.DataFrame(contents['DS'])
if trans_type: data = cmadaas_obs_convert_type(data)
# return
return data
def cmadaas_analysis_by_time(time_str, limit=None, data_code='NAFP_CLDAS2.0_NRT_ASI_NC',
levattrs={'long_name':'Height above Ground', 'units':'m'}, level_type='-',
fcst_level=None, fcst_ele="TMP", zoom=None, units=None, scale_off=None,