def Time_Crossection_rh_uv_Temp( initTime=None, model='ECMWF', points={ 'lon': [116.3833], 'lat': [39.9] }, levels=[1000, 950, 925, 900, 850, 800, 700, 600, 500, 400, 300, 200], t_gap=3, t_range=[0, 48], output_dir=None): fhours = np.arange(t_range[0], t_range[1], t_gap) # 读数据 try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='TMP', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=''), utl.Cassandra_dir(data_type='high', data_source=model, var_name='RH', lvl=''), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') if (initTime == None): initTime = get_latest_initTime(data_dir[0][0:-1] + "850") filenames = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours] TMP_4D = get_model_3D_grids(directory=data_dir[0][0:-1], filenames=filenames, levels=levels, allExists=False) TMP_2D = TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) u_4D = get_model_3D_grids(directory=data_dir[1][0:-1], filenames=filenames, levels=levels, allExists=False) u_2D = u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_4D = get_model_3D_grids(directory=data_dir[2][0:-1], filenames=filenames, levels=levels, allExists=False) v_2D = v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_4D = get_model_3D_grids(directory=data_dir[3][0:-1], filenames=filenames, levels=levels, allExists=False) rh_2D = rh_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_2D.attrs['model'] = model rh_2D.attrs['points'] = points Psfc_3D = get_model_grids(directory=data_dir[4][0:-1], filenames=filenames, allExists=False) Psfc_1D = Psfc_3D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_2D2, pressure_2D = xr.broadcast(v_2D['data'], v_2D['level']) v_2D2, Psfc_2D = xr.broadcast(v_2D['data'], Psfc_1D['data']) terrain_2D = pressure_2D - Psfc_2D crossection_graphics.draw_Time_Crossection_rh_uv_Temp( rh_2D=rh_2D, u_2D=u_2D, v_2D=v_2D, TMP_2D=TMP_2D, terrain_2D=terrain_2D, t_range=t_range, model=model, output_dir=output_dir)
def dT2m_mean24(initTime=None, fhour=48, day_back=0, map_ratio=19 / 9, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area='全国', city=False, output_dir=None, Global=False): data_dir = [ utl.Cassandra_dir(data_type='surface', data_source='ECMWF', var_name='T2m') ] fhours1 = 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] filenames1 = [initTime + '.' + str(fhour).zfill(3) for fhour in fhours1] if (fhour >= 48): fhours2 = np.arange(fhour - 21 - 24, fhour + 1 - 24, 3) filenames2 = [ initTime + '.' + str(fhour).zfill(3) for fhour in fhours2 ] if (fhour >= 36 and fhour < 48): fhours2 = np.arange(fhour - 21 + 12 - 24, fhour + 1 + 12 - 24, 3) initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') - timedelta(hours=12)).strftime('%Y%m%d%H')[2:10] filenames2 = [ initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2 ] if (fhour >= 24 and fhour < 36): fhours2 = np.arange(fhour - 21 + 24 - 24, fhour + 1 + 24 - 24, 3) initTime2 = (datetime.strptime('20' + initTime, '%Y%m%d%H') - timedelta(hours=24)).strftime('%Y%m%d%H')[2:10] filenames2 = [ initTime2 + '.' + str(fhour).zfill(3) for fhour in fhours2 ] if (fhour < 24): print('fhour should > 24') return # prepare data T_2m1 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames1) Tmn_2m1 = T_2m1.isel(time=[-1]).copy() Tmn_2m1['data'].values[0, :, :] = np.mean(T_2m1['data'].values, axis=0) T_2m2 = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames2) Tmn_2m2 = T_2m2.isel(time=[-1]).copy() Tmn_2m2['data'].values[0, :, :] = np.mean(T_2m2['data'].values, axis=0) dTmn_2m = Tmn_2m1.copy() dTmn_2m['data'].values = Tmn_2m1['data'].values - Tmn_2m2['data'].values # 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 = (dTmn_2m['lon'] > map_extent[0] - delt_x) & ( dTmn_2m['lon'] < map_extent[1] + delt_x) & ( dTmn_2m['lat'] > map_extent[2] - delt_y) & (dTmn_2m['lat'] < map_extent[3] + delt_y) dTmn_2m = dTmn_2m.where(mask1, drop=True) #- to solve the problem of labels on all the contours dTmn_2m.attrs['model'] = 'ECMWF' dTmn_2m.attrs['title'] = '2米最低温度24小时变温' elements_graphics.draw_dT_2m(dT_2m=dTmn_2m, T_type='dT2m_meann', map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def cumulated_precip(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.sum('time') 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_time('20' + filename[0:8], valid_time=fhours[0], data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE1 is None: return TPE2 = CMISS_IO.cimiss_model_by_time('20' + filename[0:8], valid_time=fhours[-1], data_code=utl.CMISS_data_code( data_source=model, var_name='TPE'), fcst_level=0, fcst_ele="TPE", units='kg*m^-2') if TPE2 is None: return except KeyError: raise ValueError('Can not find all data needed') rain = TPE1.copy(deep=True) rain['data'].values = (TPE2['data'].values - TPE1['data'].values) rain2 = rain.sum('time') # 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 rain = utl.cut_xrdata(map_extent=map_extent, xr_input=rain, delt_y=delt_y, delt_x=delt_x) rain2.attrs['model'] = model rain2.attrs['t_gap'] = t_gap rain2.attrs['initTime'] = datetime.strptime(initTime, '%y%m%d%H') rain2.attrs['fhour1'] = fhours[0] rain2.attrs['fhour2'] = fhours[-1] # draw QPF_graphics.draw_cumulated_precip(rain=rain2, map_extent=map_extent, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def periodmean_gh_uv_pwat_ulj(initTimes=None, fhours=[0], day_back=0, model='ECMWF', gh_lev=500, uv_lev=850, ulj_lev=200, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], south_China_sea=True, area=None, city=False, output_dir=None, data_source='MICAPS', Global=False, **kwargs): if (area != None): south_China_sea = False # micaps data directory if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='high', data_source=model, var_name='HGT', lvl=gh_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=uv_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='UGRD', lvl=ulj_lev), utl.Cassandra_dir(data_type='high', data_source=model, var_name='VGRD', lvl=ulj_lev), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='TCWV'), utl.Cassandra_dir(data_type='surface', data_source=model, var_name='PSFC') ] except KeyError: raise ValueError('Can not find all directories needed') filenames = [] # get filename if (initTimes != None): for initTime in initTimes: for fhour in fhours: filenames.append(utl.model_filename(initTime, fhour)) else: filenames = utl.filename_day_back_model(day_back=day_back, fhour=fhour) # retrieve data from micaps server gh = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) u = MICAPS_IO.get_model_grids(data_dir[1], filenames=filenames) v = MICAPS_IO.get_model_grids(data_dir[2], filenames=filenames) u2 = MICAPS_IO.get_model_grids(data_dir[3], filenames=filenames) v2 = MICAPS_IO.get_model_grids(data_dir[4], filenames=filenames) pwat = MICAPS_IO.get_model_grids(data_dir[5], filenames=filenames) psfc = MICAPS_IO.get_model_grids(data_dir[6], filenames=filenames) if (data_source == 'CIMISS'): # get filename filenames = [] if (initTimes != None): for initTime in initTimes: for fhour in fhours: filenames.append( '20' + utl.model_filename(initTime, fhour, UTC=True)) else: filenames = utl.filename_day_back_model(day_back=day_back, fhour=fhour, UTC=True) try: # retrieve data from CIMISS server gh = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='GPH'), filenames=filenames, fcst_level=gh_lev, fcst_ele="GPH", units='gpm') gh['data'].values = gh['data'].values / 10. u = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIU'), filenames=filenames, fcst_level=uv_lev, fcst_ele="WIU", units='m/s') v = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIV'), filenames=filenames, fcst_level=uv_lev, fcst_ele="WIV", units='m/s') u2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIU'), filenames=filenames, fcst_level=ulj_lev, fcst_ele="WIU", units='m/s') v2 = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='WIV'), filenames=filenames, fcst_level=ulj_lev, fcst_ele="WIV", units='m/s') if (model == 'ECMWF'): pwat = utl.cimiss_model_ana_grids( data_code=utl.CMISS_data_code(data_source=model, var_name='TCWV'), filenames=filenames, fcst_level=0, fcst_ele="TCWV", units='kg m-2') else: pwat = utl.cimiss_model_ana_grids( data_code=utl.CMISS_data_code(data_source=model, var_name='TIWV'), filenames=filenames, fcst_level=0, fcst_ele="TIWV", units='kg m-2') psfc = utl.cimiss_model_ana_grids(data_code=utl.CMISS_data_code( data_source=model, var_name='PRS'), filenames=filenames, fcst_level=0, fcst_ele="PRS", units='Pa') psfc['data'] = psfc['data'] / 100. except KeyError: raise ValueError('Can not find all data needed') # prepare data 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=cntr_pnt, zoom_ratio=zoom_ratio, map_ratio=map_ratio) gh = utl.cut_xrdata(map_extent, gh, delt_x=delt_x, delt_y=delt_y) u = utl.cut_xrdata(map_extent, u, delt_x=delt_x, delt_y=delt_y) v = utl.cut_xrdata(map_extent, v, delt_x=delt_x, delt_y=delt_y) u2 = utl.cut_xrdata(map_extent, u2, delt_x=delt_x, delt_y=delt_y) v2 = utl.cut_xrdata(map_extent, v2, delt_x=delt_x, delt_y=delt_y) pwat = utl.cut_xrdata(map_extent, pwat, delt_x=delt_x, delt_y=delt_y) gh = utl.mask_terrian(gh_lev, psfc, gh) u = utl.mask_terrian(uv_lev, psfc, u) v = utl.mask_terrian(uv_lev, psfc, v) u2 = utl.mask_terrian(ulj_lev, psfc, u2) v2 = utl.mask_terrian(ulj_lev, psfc, v2) uv = xr.merge([u.rename({'data': 'u'}), v.rename({'data': 'v'})]) ulj = mpcalc.wind_speed(u2['data'].values * units('m/s'), v2['data'].values * units('m/s')) ulj_xr = u2.copy(deep=True) ulj_xr['data'].values = ulj.magnitude pwat_mean = pwat.mean('time') gh_mean = gh.mean('time') ulj_mean = ulj_xr.mean('time') uv_mean = uv.mean('time') gh_mean.attrs['model'] = model gh_mean.attrs['st_time'] = gh['time'].values[0] gh_mean.attrs['ed_time'] = gh['time'].values[-1] synoptic_graphics.draw_gh_uv_pwat_ulj(pwat=pwat_mean, gh=gh_mean, uv=uv_mean, ulj=ulj_mean, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir)
def get_model_points_gy(directory, filenames, points, allExists=True, fill_null=False, Null_value=0): """ Retrieve point time series from MICAPS cassandra service. Args: directory (string): the data directory on the service. filenames (list): the list of filenames. points (dict): dictionary, {'lon':[...], 'lat':[...]}. Examples: >>> directory = "NWFD_SCMOC/TMP/2M_ABOVE_GROUND" >>> fhours = np.arange(3, 75, 3) >>> filenames = ["19083008."+str(fhour).zfill(3) for fhour in fhours] >>> points = {'lon':[116.3833, 110.0], 'lat':[39.9, 32]} >>> data = get_model_points(dataDir, filenames, points) >>> allExists (boolean): all files should exist, or return None. """ data = get_model_grids(directory, filenames, allExists=allExists) #if(fill_null is True): # temp=np.array(data['data'].values) # idx_null=np.where(temp == Null_value) # #temp[idx_null]=np.nan # temp2=gaussian_filter(temp,5) # temp[idx_null]=temp2[idx_null] # data['data'].values=temp if (fill_null is True): temp = np.array(data['data'].values) dims = np.shape(temp) grid_x = np.array(data['lon'].values) grid_y = np.array(data['lat'].values) x, y = np.meshgrid(data['lon'].values, data['lat'].values) idx_x = np.squeeze( np.where((grid_x > points['lon'][0] - 6) & (grid_x < points['lon'][0] + 6))) idx_y = np.squeeze( np.where((grid_y > points['lat'][0] - 5) & (grid_y < points['lat'][0] + 5))) x2, y2 = np.meshgrid(grid_x[idx_x[0]:idx_x[-1]], grid_y[idx_y[0]:idx_y[-1]]) nx2 = len(idx_x) ny2 = len(idx_y) x = x.reshape(dims[1] * dims[2]) y = y.reshape(dims[1] * dims[2]) nt = dims[0] for it in range(0, nt): temp2 = np.squeeze(temp[it, :, :]) temp2 = temp2.reshape(dims[1] * dims[2]) idx_ok = np.squeeze( np.where((temp2 != Null_value) & (x < points['lon'][0] + 6) & (x > points['lon'][0] - 6) & (y < points['lat'][0] + 5) & (y > points['lat'][0] - 5))) n_ok = len(idx_ok) data_new = griddata( np.squeeze(np.dstack(([y[idx_ok], x[idx_ok]]))), temp2[idx_ok], (y2, x2)) temp[it, idx_y[0]:idx_y[-1], idx_x[0]:idx_x[-1]] = data_new.reshape(1, ny2 - 1, nx2 - 1) data['data'].values = temp if data: return data.interp(lon=('points', points['lon']), lat=('points', points['lat'])) else: return None
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 cu_rain(initTime=None, atime=6, 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, **kwargs): # prepare data if (data_source == 'MICAPS'): try: data_dir = [ utl.Cassandra_dir(data_type='surface', data_source='CLDAS', var_name='RAIN01') ] except KeyError: raise ValueError('Can not find all directories needed') # get filename if (initTime == None): initTime = (datetime.now() - timedelta(hours=2)).strftime('%y%m%d%H') filenames = [] for ihour in range(0, atime): filenames.append((datetime.strptime(initTime, '%y%m%d%H') - timedelta(hours=ihour)).strftime('%y%m%d%H') + '.000') # retrieve data from micaps server rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames) if rain is None: return if (data_source == 'CIMISS'): # get filename if (initTime == None): initTime = (datetime.now() - timedelta(hours=2 + 8)).strftime('%y%m%d%H') filenames = [] for ihour in range(0, atime): filenames.append((datetime.strptime(initTime, '%y%m%d%H') - timedelta(hours=ihour)).strftime('%Y%m%d%H') + '0000') try: # retrieve data from CIMISS server rain = CIMISS_IO.cimiss_analysis_by_times( times_str=filenames, fcst_ele='PRE', data_code=utl.CMISS_data_code(data_source='CLDAS', var_name='PRE'), ) if rain is None: return rain = rain.rename({'PRE': 'data'}) 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=cntr_pnt, zoom_ratio=zoom_ratio, map_ratio=map_ratio) rain = utl.cut_xrdata(map_extent, rain, delt_x=delt_x, delt_y=delt_y) rain['data'].values[rain['data'].values == 9999.] = np.nan cu_rain = rain.sum('time') cu_rain.attrs['obs_time'] = datetime.strptime(initTime, '%y%m%d%H') cu_rain.attrs['model'] = 'CLDAS' cu_rain.attrs['atime'] = atime cu_rain.attrs['var_name'] = '累积降水' # draw QPF_graphics.draw_obs_cu_rain(rain=cu_rain, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir)
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 cumulative_precip_and_rain_days(endtime=None, cu_ndays=5, rn_ndays=7, map_ratio=19 / 11, zoom_ratio=20, cntr_pnt=[102, 34], south_China_sea=True, area=None, city=False, output_dir=None, Global=False, **kwargs): # prepare data data_dir = [ utl.Cassandra_dir(data_type='surface', data_source='CLDAS', var_name='RAIN24') ] # get filename cu_days = np.arange(0, cu_ndays) filenames_cu = [ (datetime.strptime('20' + endtime, '%Y%m%d%H') - timedelta(days=int(icu_days))).strftime('%Y%m%d%H')[2:] + '.000' for icu_days in cu_days ] rn_days = np.arange(0, rn_ndays) filenames_days = [ (datetime.strptime('20' + endtime, '%Y%m%d%H') - timedelta(days=int(irn_days))).strftime('%Y%m%d%H')[2:] + '.000' for irn_days in rn_days ] # retrieve data from micaps server cu_rain_all = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames_cu) cu_days_rain = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames_days) coords = MICAPS_IO.get_model_grid(data_dir[0], filename=filenames_days[0]) # set map extent if (area != None): if (area != None): south_China_sea = False 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 mask1 = (cu_rain_all['lon'] > map_extent[0] - delt_x) & ( cu_rain_all['lon'] < map_extent[1] + delt_x) & ( cu_rain_all['lat'] > map_extent[2] - delt_y) & ( cu_rain_all['lat'] < map_extent[3] + delt_y) mask2 = (cu_days_rain['lon'] > map_extent[0] - delt_x) & ( cu_days_rain['lon'] < map_extent[1] + delt_x) & ( cu_days_rain['lat'] > map_extent[2] - delt_y) & ( cu_days_rain['lat'] < map_extent[3] + delt_y) coords = coords.where(mask1, drop=True) cu_rain_all = cu_rain_all.where(mask1, drop=True) mask11 = (cu_rain_all['data'] == 9999.) cu_rain_all['data'].values[mask11.values] = np.nan cu_days_rain = cu_days_rain.where(mask2, drop=True) mask22 = (cu_days_rain['data'] == 9999.) cu_days_rain['data'].values[mask22.values] = 0 cu_rain = xr.DataArray([np.sum(cu_rain_all['data'].values, axis=0)], coords=coords['data'].coords, dims=coords['data'].dims) mask3 = (cu_days_rain['data'] > 0) cu_days_rain['data'].values[mask3.values] = 1 days_rain = xr.DataArray([np.sum(cu_days_rain['data'].values, axis=0)], coords=coords['data'].coords, dims=coords['data'].dims) days_rain.attrs['rn_ndays'] = rn_ndays cu_rain.attrs['cu_ndays'] = cu_ndays # draw observation_graphics.draw_cumulative_precip_and_rain_days( cu_rain=cu_rain, days_rain=days_rain, map_extent=map_extent, regrid_shape=20, city=city, south_China_sea=south_China_sea, output_dir=output_dir, Global=Global)
def cu_Tmn2(endtime, cu_ndays=1, map_ratio=14 / 9, zoom_ratio=20, cntr_pnt=[104, 34], area=None, **kargws): # prepare data data_dir = [ utl.Cassandra_dir(data_type='surface', data_source='CLDAS', var_name='Tmn_2m') ] # get filename cu_days = np.arange(0, cu_ndays) filenames_cu = [ (datetime.strptime('20' + endtime, '%Y%m%d%H') - timedelta(days=int(icu_days))).strftime('%Y%m%d%H')[2:] + '.000' for icu_days in cu_days ] # retrieve data from micaps server Tmn2m_all = MICAPS_IO.get_model_grids(data_dir[0], filenames=filenames_cu) coords = MICAPS_IO.get_model_grid(data_dir[0], filename=filenames_cu[0]) # set map extent if (area != None): if (area != None): south_China_sea = False 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 mask1 = ((Tmn2m_all['lon'] > map_extent[0] - delt_x) & (Tmn2m_all['lon'] < map_extent[1] + delt_x) & (Tmn2m_all['lat'] > map_extent[2] - delt_y) & (Tmn2m_all['lat'] < map_extent[3] + delt_y)) coords = coords.where(mask1, drop=True) Tmn2m_all = Tmn2m_all.where(mask1, drop=True) mask11 = (Tmn2m_all['data'] == 9999.) Tmn2m_all['data'].values[mask11.values] = np.nan Tmn2 = xr.DataArray(np.max(Tmn2m_all['data'].values, axis=0), name='data', coords={ 'time': ('time', [Tmn2m_all['time'].values[0]]), 'lat': ('lat', Tmn2m_all['lat'].values), 'lon': ('lon', Tmn2m_all['lon'].values) }, dims=('time', 'lat', 'lon'), attrs={ 'model_name': 'CLDAS', 'var_name': '最低温度', 'vhours': cu_ndays * 24 }) # draw draw_TMP2(TMP2=Tmn2, map_extent=map_extent, **kargws)
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 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)
def Time_Crossection_rh_uv_Temp(initTime=None,model='ECMWF',points={'lon':[116.3833], 'lat':[39.9]}, levels=[1000, 950, 925, 900, 850, 800, 700,600,500,400,300,200],data_source='MICAPS', t_gap=3,t_range=[0,48],lw_ratio=[16,9],output_dir=None,**kwargs): fhours = np.arange(t_range[0], t_range[1], t_gap) # 读数据 if(data_source == 'MICAPS'): try: data_dir = [utl.Cassandra_dir(data_type='high',data_source=model,var_name='TMP',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='UGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='VGRD',lvl=''), utl.Cassandra_dir(data_type='high',data_source=model,var_name='RH',lvl=''), utl.Cassandra_dir(data_type='surface',data_source=model,var_name='PSFC')] except KeyError: raise ValueError('Can not find all directories needed') if(initTime==None): initTime = get_latest_initTime(data_dir[0][0:-1]+"850") filenames = [initTime+'.'+str(fhour).zfill(3) for fhour in fhours] TMP_4D=get_model_3D_grids(directory=data_dir[0][0:-1],filenames=filenames,levels=levels, allExists=False) u_4D=get_model_3D_grids(directory=data_dir[1][0:-1],filenames=filenames,levels=levels, allExists=False) v_4D=get_model_3D_grids(directory=data_dir[2][0:-1],filenames=filenames,levels=levels, allExists=False) rh_4D=get_model_3D_grids(directory=data_dir[3][0:-1],filenames=filenames,levels=levels, allExists=False) Psfc_3D=get_model_grids(directory=data_dir[4][0:-1],filenames=filenames,allExists=False) 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: rh_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model,var_name='RHU'), fcst_levels=levels, fcst_ele="RHU", units='%',pbar=True) u_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model,var_name='WIU'), fcst_levels=levels, fcst_ele="WIU", units='m/s',pbar=True) v_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model,var_name='WIV'), fcst_levels=levels, fcst_ele="WIV", units='m/s',pbar=True) TMP_4D=CMISS_IO.cimiss_model_3D_grids(init_time_str='20'+filename[0:8],valid_times=fhours, data_code=utl.CMISS_data_code(data_source=model,var_name='TEM'), fcst_levels=levels, fcst_ele="TEM", units='K',pbar=True) TMP_4D['data'].values=TMP_4D['data'].values-273.15 Psfc_3D=CMISS_IO.cimiss_model_grids(init_time_str='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',pbar=True) except KeyError: raise ValueError('Can not find all data needed') TMP_2D=TMP_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) u_2D=u_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_2D=v_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_2D=rh_4D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) rh_2D.attrs['model']=model rh_2D.attrs['points']=points Psfc_1D=Psfc_3D.interp(lon=('points', points['lon']), lat=('points', points['lat'])) v_2D2,pressure_2D = xr.broadcast(v_2D['data'],v_2D['level']) v_2D2,Psfc_2D = xr.broadcast(v_2D['data'],Psfc_1D['data']) terrain_2D=pressure_2D-Psfc_2D crossection_graphics.draw_Time_Crossection_rh_uv_Temp( rh_2D=rh_2D, u_2D=u_2D, v_2D=v_2D,TMP_2D=TMP_2D,terrain_2D=terrain_2D, t_range=t_range,model=model,lw_ratio=lw_ratio,output_dir=output_dir)