def cumulated_precip_evo(initTime=None, t_gap=6, t_range=[6, 36], day_back=0, model='ECMWF', data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): fhours = np.arange(t_range[0], t_range[1] + 1, t_gap) # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='RAIN' + '%02d' % t_gap) ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(data_dir[0]) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] # retrieve data from micaps server rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) rain2 = rain.copy(deep=True) for itime in range(1, len(rain['forecast_period'].values)): rain2['data'].values[itime, :, :] = np.sum( rain['data'].values[0:itime + 1, :, :], axis=0) if (data_source == 'CIMISS'): if (initTime != None): filename = utl.model_filename(initTime, 0, UTC=True) else: filename = utl.filename_day_back_model(day_back=0, fhour=0, UTC=True) try: TPE1 = CMISS_IO.cimiss_model_by_times( '20' + filename[0:8], valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='TPE'), levattrs={ 'long_name': 'Height above Ground', 'units': 'm', '_CoordinateAxisType': '-' }, fcst_level=0, fcst_ele="TPE", units='kg*m^-2') except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = (TPE1['data'].values) # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) else: map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 mask1 = (rain['lon'] > map_extent[0] - delt_x) & ( rain['lon'] < map_extent[1] + delt_x) & ( rain['lat'] > map_extent[2] - delt_y) & (rain['lat'] < map_extent[3] + delt_y) rain2 = rain2.where(mask1, drop=True) rain2.attrs['model'] = model rain2.attrs['t_gap'] = t_gap # draw QPF_graphics.draw_cumulated_precip_evo(rain=rain2, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def T2m_mean24(initTime=None, fhour=24, day_back=0, model='中央气象台中短期指导', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): # prepare data if (data_source == 'MICAPS'): data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] fhours = np.arange(fhour - 21, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour)[0:8] filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) Tmean_2m = T_2m.isel(time=[-1]).copy() Tmean_2m['data'].values[0, :, :] = np.mean(T_2m['data'].values, axis=0) if (data_source == 'CIMISS'): # get filename fhours = np.arange(fhour - 18, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True)[0:8] T_2m = CMISS_IO.cimiss_model_by_times('20' + initTime, valid_times=fhours, data_code=utl.CMISS_data_code( data_source=model, var_name='TEF2'), fcst_level=0, fcst_ele='TEF2', units='K', allExists=False) T_2m['data'].values = T_2m['data'].values - 273.15 Tmean_2m = T_2m.isel(time=[-1]).copy() Tmean_2m['data'].values[0, :, :] = np.min(T_2m['data'].values, axis=0) # set map extent if (area != '全国'): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (Tmean_2m['lon'] > map_extent[0] - delt_x) & ( Tmean_2m['lon'] < map_extent[1] + delt_x) & ( Tmean_2m['lat'] > map_extent[2] - delt_y) & ( Tmean_2m['lat'] < map_extent[3] + delt_y) Tmean_2m = Tmean_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours Tmean_2m.attrs['model'] = model Tmean_2m.attrs['title'] = '2米平均温度' elements_graphics.draw_T_2m(T_2m=Tmean_2m, T_type='T_mean', map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def tmp_evo(initTime=None, tmp_lev=850, t_gap=6, t_range=[6, 36], model='ECMWF', data_source='MICAPS', map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, **kwargs): fhours = np.arange(t_range[0], t_range[1], t_gap) #prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=tmp_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime == None): initTime = MICAPS_IO.get_latest_initTime(data_dir[0]) filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] # retrieve data from micaps server tmp = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) psfc = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames) if (data_source == 'CIMISS'): # get filename if (initTime != None): filename = utl.model_filename(initTime, 0, UTC=True) else: filename = utl.filename_day_back_model(day_back=0, fhour=0, UTC=True) try: tmp = CMISS_IO.cimiss_model_by_times( '20' + filename[0:8], valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='TEM'), levattrs={ 'long_name': 'pressure_level', 'units': 'hPa', '_CoordinateAxisType': '-' }, fcst_level=tmp_lev, fcst_ele="TEM", units='K') tmp['data'].values = tmp['data'].values - 273.15 psfc = CMISS_IO.cimiss_model_by_times( '20' + filename[0:8], valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='PRS'), fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # set map extent if (area != None): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent, delt_x, delt_y = utl.get_map_extent(cntr_pnt, zoom_ratio, map_ratio) tmp = utl.cut_xrdata(map_extent, tmp, delt_x=delt_x, delt_y=delt_y) tmp = tmp.rolling({'lon': 3, 'lat': 3}).mean() psfc = utl.cut_xrdata(map_extent, psfc, delt_x=delt_x, delt_y=delt_y) tmp = utl.mask_terrian(tmp_lev, psfc, tmp) tmp.attrs['model'] = model coldwave_graphics.draw_tmp_evo(tmp=tmp, map_extent=map_extent, south_China_sea=south_China_sea, **kwargs)
def T2m_mx24(initTime=None, fhour=24, day_back=0, model='中央气象台中短期指导', map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], data_source='MICAPS', area=None, **kargws): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='Tmx_2m') ] if (initTime != None): filename = utl.model_filename(initTime, fhour) else: filename = utl.filename_day_back_model(day_back=day_back, fhour=fhour) Tmx_2m = MICAPS_IO.get_model_grid(data_dir[0], filename=filename) except: try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='Tmx3_2m') ] except: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source=model, var_name='T2m') ] fhours = np.arange(fhour - 21, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour)[0:8] filenames = [ initTime + '.' + str(fhour).zfill(3) for fhour in fhours ] T_2m = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) Tmx_2m = T_2m.isel(time=[-1]).copy() Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values, axis=0) if (data_source == 'CIMISS'): # get filename fhours = np.arange(fhour - 18, fhour + 1, 3) if (initTime is None): initTime = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True)[0:8] try: # retrieve data from CMISS server T_2m = CMISS_IO.cimiss_model_by_times( '20' + initTime, valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='MX2T6'), fcst_level=0, fcst_ele='MX2T6', units='K', allExists=False) except: T_2m = CMISS_IO.cimiss_model_by_times( '20' + initTime, valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model, var_name='TEF2'), fcst_level=0, fcst_ele='TEF2', units='K', allExists=False) if T_2m is None: return T_2m['data'].values = T_2m['data'].values - 273.15 Tmx_2m = T_2m.isel(time=[-1]).copy() Tmx_2m['data'].values[0, :, :] = np.max(T_2m['data'].values, axis=0) # set map extent if (area != '全国'): south_China_sea = False if (area != None): cntr_pnt, zoom_ratio = utl.get_map_area(area_name=area) map_extent = [0, 0, 0, 0] map_extent[0] = cntr_pnt[0] - zoom_ratio * 1 * map_ratio map_extent[1] = cntr_pnt[0] + zoom_ratio * 1 * map_ratio map_extent[2] = cntr_pnt[1] - zoom_ratio * 1 map_extent[3] = cntr_pnt[1] + zoom_ratio * 1 delt_x = (map_extent[1] - map_extent[0]) * 0.2 delt_y = (map_extent[3] - map_extent[2]) * 0.1 #+ to solve the problem of labels on all the contours mask1 = (Tmx_2m['lon'] > map_extent[0] - delt_x) & ( Tmx_2m['lon'] < map_extent[1] + delt_x) & ( Tmx_2m['lat'] > map_extent[2] - delt_y) & (Tmx_2m['lat'] < map_extent[3] + delt_y) Tmx_2m = Tmx_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours Tmx2 = xr.DataArray(np.squeeze(Tmx_2m['data'].values, axis=0), name='data', coords={ 'time': ('time', [Tmx_2m['time'].values[0]]), 'fhour': ('time', [fhour]), 'lat': ('lat', Tmx_2m['lat'].values), 'lon': ('lon', Tmx_2m['lon'].values) }, dims=('time', 'lat', 'lon'), attrs={ 'model_name': '中央气象台中短期指导', 'var_name': '2米最高温度', 'vhours': 24 }) draw_SCMOC.draw_TMP2(TMP2=Tmx2, map_extent=map_extent, **kargws)