meteva

提供气象产品检验相关python程序


合并

<p>[TOC]</p> <p>生成测试数据</p> <pre><code class="language-python">data = {"站号":np.arange(54511,54515).tolist(), "经度":np.arange(100.0,104,1).tolist(), "纬度":np.arange(30.0,34,1).tolist(), "数据":(np.random.rand(4)*100).astype(np.int16)} df = pd.DataFrame(data) print(df)</code></pre> <pre><code> 站号 经度 纬度 数据 0 54511 100.0 30.0 54 1 54512 101.0 31.0 96 2 54513 102.0 32.0 43 3 54514 103.0 33.0 39</code></pre> <pre><code class="language-python">sta_ob = meb.sta_data(df,columns = ["id","lon","lat","data0"]) meb.set_stadata_names(sta_ob,["ob"]) meb.set_stadata_coords(sta_ob,level = 0,time = datetime.datetime(2019,1,2,8,0),dtime = 0) print(sta_ob)</code></pre> <pre><code> level time dtime id lon lat ob 0 0 2019-01-02 08:00:00 0 54511 100.0 30.0 54 1 0 2019-01-02 08:00:00 0 54512 101.0 31.0 96 2 0 2019-01-02 08:00:00 0 54513 102.0 32.0 43 3 0 2019-01-02 08:00:00 0 54514 103.0 33.0 39</code></pre> <pre><code class="language-python">sta_ec = copy.deepcopy(sta_ob) meb.set_stadata_names(sta_ec,["ec"]) sta_ec["time"].values[0:2] = datetime.datetime(2019,1,1,8,0) sta_ec["time"].values[2:] = datetime.datetime(2019,1,1,20,0) sta_ec["dtime"].values[0:4:2] = 12 sta_ec["dtime"].values[1:4:2] = 24 print(sta_ec)</code></pre> <pre><code> level time dtime id lon lat ec 0 0 2019-01-01 08:00:00 12 54511 100.0 30.0 54 1 0 2019-01-01 08:00:00 24 54512 101.0 31.0 96 2 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 3 0 2019-01-01 20:00:00 24 54514 103.0 33.0 39</code></pre> <h1>数据拼接</h1> <p><font face="黑体" color=blue size = 5><strong>concat(data_list)</strong></font><br /> 输入站点数据的列表,将多个站点数据在纵向拼接</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>data_list</font></strong></td> <td style="text-align: left;">站点数据或格点数据列表,通常用于将多个起报时间、多个预报时效的数据合并在一起</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">拼接得到的一个完整的站点或网格</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">sta_ob1 = sta_ob.copy() sta_ob1["time"]+=datetime.timedelta(hours = 24) sta_ob = meb.concat([sta_ob,sta_ob1]) # 将两份站点数据拼接在一起 print(sta_ob)</code></pre> <pre><code> level time dtime id lon lat ob 0 0 2019-01-02 08:00:00 0 54511 100.0 30.0 54 1 0 2019-01-02 08:00:00 0 54512 101.0 31.0 96 2 0 2019-01-02 08:00:00 0 54513 102.0 32.0 43 3 0 2019-01-02 08:00:00 0 54514 103.0 33.0 39 0 0 2019-01-03 08:00:00 0 54511 100.0 30.0 54 1 0 2019-01-03 08:00:00 0 54512 101.0 31.0 96 2 0 2019-01-03 08:00:00 0 54513 102.0 32.0 43 3 0 2019-01-03 08:00:00 0 54514 103.0 33.0 39</code></pre> <pre><code class="language-python">sta_grapes = copy.deepcopy(sta_ec) sta_grapes["dtime"] += 24 sta_grapes = meb.concat([sta_ec,sta_grapes]) # 将两份站点数据拼接在一起 meb.set_stadata_names(sta_grapes,["grapes"]) print(sta_grapes)</code></pre> <pre><code> level time dtime id lon lat grapes 0 0 2019-01-01 08:00:00 12 54511 100.0 30.0 54 1 0 2019-01-01 08:00:00 24 54512 101.0 31.0 96 2 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 3 0 2019-01-01 20:00:00 24 54514 103.0 33.0 39 0 0 2019-01-01 08:00:00 36 54511 100.0 30.0 54 1 0 2019-01-01 08:00:00 48 54512 101.0 31.0 96 2 0 2019-01-01 20:00:00 36 54513 102.0 32.0 43 3 0 2019-01-01 20:00:00 48 54514 103.0 33.0 39</code></pre> <pre><code class="language-python">time_s = datetime.datetime(2021,7,15,8,0) time_e = datetime.datetime(2021,7,20,8,0) grid0 = meb.grid([108,118,0.1],[30,38,0.1]) time1 = time_s dir1 = r"H:\test_data\input\meb\combine_grd_test\ECMWF_HR\APCP\YYYYMMDD\YYMMDDHH.TTT.nc" grd_list = [] while time1 &lt;= time_e: for dh in range(0,241,12): path = meb.get_path(dir1,time1,dh) grd = meb.read_griddata_from_nc(path,grid = grid0,time = time1,dtime = dh,data_name ="ECMWF") # 读取逐个 if grd is not None: grd_list.append(grd) time1 = time1 + datetime.timedelta(hours = 12) grd_ec_acpc = meb.concat(grd_list) print(grd_ec_acpc)</code></pre> <pre><code>&lt;xarray.DataArray 'data0' (member: 1, level: 1, time: 11, dtime: 21, lat: 81, lon: 101)&gt; array([[[[[[0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], [[0.00000000e+00, 1.50000000e-02, 3.10000000e-02, ..., 2.33500000e+00, 1.61700000e+00, 1.37300000e+00], [0.00000000e+00, 0.00000000e+00, 1.50000000e-02, ..., 2.56300000e+00, 1.74000000e+00, 1.20500000e+00], [0.00000000e+00, 0.00000000e+00, 3.10000000e-02, ..., 1.87700000e+00, 1.03800000e+00, 1.25100000e+00], ... [1.32140000e+01, 1.28780000e+01, 1.17490000e+01, ..., 1.83100000e+00, 1.43400000e+00, 1.43400000e+00], [1.42820000e+01, 1.32750000e+01, 1.20850000e+01, ..., 3.35700000e+00, 1.77000000e+00, 1.49500000e+00], [1.27870000e+01, 1.44040000e+01, 1.55640000e+01, ..., 5.12700000e+00, 3.84500000e+00, 2.62500000e+00]], [[3.11580000e+01, 3.87270000e+01, 3.46070000e+01, ..., 1.56891000e+02, 1.62628000e+02, 1.58386000e+02], [2.56040000e+01, 3.30810000e+01, 3.76890000e+01, ..., 1.43646000e+02, 1.74286000e+02, 1.93085000e+02], [2.80150000e+01, 3.79330000e+01, 3.48510000e+01, ..., 1.11450000e+02, 1.47614000e+02, 2.08038000e+02], ..., [1.32140000e+01, 1.28780000e+01, 1.17490000e+01, ..., 2.59400000e+00, 2.01400000e+00, 1.83100000e+00], [1.42820000e+01, 1.32750000e+01, 1.20850000e+01, ..., 3.35700000e+00, 1.77000000e+00, 1.49500000e+00], [1.27870000e+01, 1.44040000e+01, 1.55640000e+01, ..., 5.12700000e+00, 3.84500000e+00, 2.62500000e+00]]]]]]) Coordinates: * member (member) &lt;U5 'ECMWF' * level (level) float64 0.0 * time (time) datetime64[ns] 2021-07-15T08:00:00 ... 2021-07-20T08:00:00 * dtime (dtime) int32 0 12 24 36 48 60 72 ... 168 180 192 204 216 228 240 * lat (lat) float64 30.0 30.1 30.2 30.3 30.4 ... 37.6 37.7 37.8 37.9 38.0 * lon (lon) float64 108.0 108.1 108.2 108.3 ... 117.7 117.8 117.9 118.0</code></pre> <h1>基于站点的横向合并</h1> <p><font face="黑体" color=blue size = 5><strong>combine_on_id(sta, sta1)</strong></font><br /> 将两个站点数据在横向合并,只保留一份时空坐标信息,站号一致的会被合并到一行。在数据中一个站号对应多条不同时刻或层次的数据记录时,该函数不可用 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta1</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">如果sta和sta1中一个为None,则返回另一个。否则返回两者合并结果,合并时采用id作为合并依据,保留两个站点数据中都有的站点,其它时空坐标信息采用sta中的坐标信息。</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">sta_c2 = meb.combine_on_id(sta_ob,sta_ec) print(sta_c2)</code></pre> <pre><code> level time dtime id lon lat ob ec 0 0 2019-01-02 08:00:00 0 54511 100.0 30.0 54 54 1 0 2019-01-03 08:00:00 0 54511 100.0 30.0 54 54 2 0 2019-01-02 08:00:00 0 54512 101.0 31.0 96 96 3 0 2019-01-03 08:00:00 0 54512 101.0 31.0 96 96 4 0 2019-01-02 08:00:00 0 54513 102.0 32.0 43 43 5 0 2019-01-03 08:00:00 0 54513 102.0 32.0 43 43 6 0 2019-01-02 08:00:00 0 54514 103.0 33.0 39 39 7 0 2019-01-03 08:00:00 0 54514 103.0 33.0 39 39</code></pre> <h1>基于所有坐标的横向合并</h1> <p><font face="黑体" color=blue size = 5><strong>combine_on_all_coords(sta, sta1)</strong></font><br /> 将两个站点数据在横向合并,只保留一份时空坐标信息。合并时包括level,time,dtime,id,lon,lat在内的所有坐标都一致的数据才会合并到一行 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta1</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">如果sta和sta1中一个为None,则返回另一个。否则返回两者合并结果,合并时仅保留所有维度的取值都一样的站点</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">sta_c3 = meb.combine_on_all_coords(sta_ob,sta_ec) print(sta_c3)</code></pre> <pre><code>Empty DataFrame Columns: [level, time, dtime, id, lon, lat, ob, ec] Index: []</code></pre> <pre><code class="language-python">sta_c4 = meb.combine_on_all_coords(sta_ec,sta_grapes) print(sta_c4)</code></pre> <pre><code> level time dtime id lon lat ec grapes 0 0 2019-01-01 08:00:00 12 54511 100.0 30.0 54 54 1 0 2019-01-01 08:00:00 24 54512 101.0 31.0 96 96 2 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 43 3 0 2019-01-01 20:00:00 24 54514 103.0 33.0 39 39</code></pre> <h1>基于level,time,dtime和id的横向合并</h1> <p><font face="黑体" color=blue size = 5><strong>combine_on_level_time_dtime_id(sta, sta1)</strong></font><br /> 将两个站点数据在横向合并,只保留一份时空坐标信息。合并时包括level,time,dtime,id在内的坐标都一致的数据才会合并到一行,该函数的应用场景是有时站点数据中的Id是可靠的,但lon 和lat 不够可靠或不够精确时,该函数能够比combine_on_all_coords实现更准确的匹配。 但是在一些海洋观测中,很多移动观测数据的id不可靠,则不能采用该函数进行数据的合并。 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta1</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">如果sta和sta1中一个为None,则返回另一个。否则返回两者合并结果,合并时仅保留level,time,dtime,id共4个坐标取值都一样的站点</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">sta_c4 = meb.combine_on_level_time_dtime_id(sta_ec,sta_grapes) print(sta_c4)</code></pre> <pre><code> level time dtime id lon lat ec grapes 0 0 2019-01-01 08:00:00 12 54511 100.0 30.0 54 54 1 0 2019-01-01 08:00:00 24 54512 101.0 31.0 96 96 2 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 43 3 0 2019-01-01 20:00:00 24 54514 103.0 33.0 39 39</code></pre> <h1>观测和预报的匹配合并</h1> <p><font face="黑体" color=blue size = 5><strong>combine_on_obTime(sta_ob, sta_fo_list,need_match_ob = False)</strong></font><br /> 首先不同的预报数据基于所有时空坐标进行横向合并。再根据合并结果中每一行数据中的起报时间(time)和预报时效(dtime)计算出其在观测数据sta_ob中对应的观测时刻ob_time,如果ob_time 和sta_ob中数据时刻一致,且id,lon,lat,level也一致,则将观测值加入到该行数据中的第一列。 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob</font></strong></td> <td style="text-align: left;">观测站点数据,其中dtime列都为0,</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_fo_list</font></strong></td> <td style="text-align: left;">预报站点数据列表</td> </tr> <tr> <td style="text-align: left;"><strong>need_match_ob</strong></td> <td style="text-align: left;">是否要求在观测不缺测的情况下匹配合并,缺省情况下如果预报对应的观测不存在则会以999999填充,如果该参数选为True,则预报找不到对应的观测会被删除。</td> </tr> </tbody> </table> <p>|<font face="黑体" color=blue size=5>return</font>| 合并后的站点数据。 |</p> <h1>观测和预报的匹配合并(水平坐标基于id)</h1> <p><font face="黑体" color=blue size = 5><strong>combine_on_obTime_id(sta_ob, sta_fo_list,need_match_ob = False,how_fo = &quot;inner&quot;)</strong></font><br /> 首先不同的预报数据基于id,level,time,dtime进行横向合并。再根据合并结果中每一行数据中的起报时间(time)和预报时效(dtime)计算出其在观测数据sta_ob中对应的观测时刻obTime,如果obTime 和sta_ob中数据时刻一致,且id,level也一致,则将观测值加入到该行数据中的第一列。 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_ob</font></strong></td> <td style="text-align: left;">观测站点数据,其中dtime列都为0,</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_fo_list</font></strong></td> <td style="text-align: left;">预报站点数据列表</td> </tr> <tr> <td style="text-align: left;"><strong>need_match_ob</strong></td> <td style="text-align: left;">是否要求在观测不缺测的情况下匹配合并,缺省情况下如果预报对应的观测不存在则会以999999填充,如果该参数选为True,则预报找不到对应的观测会被删除。</td> </tr> <tr> <td style="text-align: left;"><strong>how_fo</strong></td> <td style="text-align: left;">是否不同预报严格匹配,inner 表示预报严格匹配,即所有预报成员时空坐标的交集,outer 表示合并结果是所有预报成员的时空坐标的并集,left表示所有匹配合并结果时空坐标向第一个预报看齐,right表示匹配结果时空坐标向最后一个预报看齐,在后三种选项中预报值缺失时采用meb.IV,即999999填充</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">合并后的站点数据。</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">sta_ec.loc[1,"lon"] = 101.1 sta_c4 = meb.combine_on_obTime_id(sta_ob,[sta_ec,sta_grapes]) #保留观测缺测的部分 print(sta_c4)</code></pre> <pre><code> level time dtime id lon lat ob ec grapes 2 0 2019-01-01 08:00:00 12 54511 100.0 30.0 999999.0 54 54 0 0 2019-01-01 08:00:00 24 54512 101.1 31.0 96.0 96 96 1 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43.0 43 43 3 0 2019-01-01 20:00:00 24 54514 103.0 33.0 999999.0 39 39</code></pre> <pre><code class="language-python">sta_c4 = meb.combine_on_obTime_id(sta_ob,[sta_ec,sta_grapes],need_match_ob=True) # 不保留观测缺测的部分 print(sta_c4)</code></pre> <pre><code> level time dtime id lon lat ob ec grapes 0 0 2019-01-01 08:00:00 24 54512 101.0 31.0 96 96 96 1 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 43 43</code></pre> <pre><code class="language-python"> #保留预报缺省的部分 sta_out = meb.combine_on_obTime_id(sta_ob,[sta_ec,sta_grapes],need_match_ob=True,how_fo = "outer") print(sta_out)</code></pre> <pre><code> level time dtime id lon lat ob ec grapes 0 0 2019-01-01 08:00:00 24 54512 101.0 31.0 96 96.0 96 1 0 2019-01-01 08:00:00 48 54512 101.0 31.0 96 999999.0 96 2 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 43.0 43 3 0 2019-01-01 20:00:00 36 54513 102.0 32.0 43 999999.0 43</code></pre> <pre><code class="language-python">sta_c4 = meb.combine_on_obTime(sta_ob,[sta_ec,sta_grapes]) print(sta_c4) #sta_ec站号为54512的站点lon和sta_ob,sta_grapes中有所偏差,采用该函数就无法实现匹配 </code></pre> <pre><code> level time dtime id lon lat ob ec grapes 0 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43.0 43 43 1 0 2019-01-01 08:00:00 12 54511 100.0 30.0 999999.0 54 54 2 0 2019-01-01 20:00:00 24 54514 103.0 33.0 999999.0 39 39</code></pre> <pre><code class="language-python">sta_c4 = meb.combine_on_obTime(sta_ob,[sta_ec,sta_grapes],True) print(sta_c4) #sta_ec站号为54512的站点lon和sta_ob,sta_grapes中有所偏差,采用该函数就无法实现匹配 </code></pre> <pre><code> level time dtime id lon lat ob ec grapes 0 0 2019-01-01 20:00:00 12 54513 102.0 32.0 43 43 43</code></pre> <h1>扩展合并</h1> <p><strong>combine_expand_IV(sta,sta_with_IV)</strong><br /> 在实践中,有些数据是和时空信息完全相关的,而有些数据则仅和部分时空信息相关,比如地面站点数据的站点高度就之和空间位置有关和时间无关。如果要将这两种数据对齐到一个站点数据中,则需要用到本函数。 </p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta</font></strong></td> <td style="text-align: left;">站点数据</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>sta_with_IV</font></strong></td> <td style="text-align: left;">站点数据,其中level,time,dtime,id四列中的某些列取值为NAN或meb.IV, 代表该数据和这些维度无关,而剩下的列取值不为NAN或meb.IV,代表数据随这些维度的坐标而变化</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">合并后的站点数据。</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">data = {"level":[0,0], "time":[datetime.datetime(2020,1,1,8,0),datetime.datetime(2020,1,1,8,0)], "dtime":[0,0], "id":[54511,54512], "lon":[100,101], "lat":[30,40], "dat":[10,20] } sta =meb.sta_data(pd.DataFrame(data)) sta1 = sta.copy() sta1["time"] = datetime.datetime(2020,1,2,8,0) sta2 = sta.copy() sta2["dtime"] = 24 sta_all = pd.concat([sta,sta1,sta2],axis = 0) print(sta_all)</code></pre> <pre><code> level time dtime id lon lat dat 0 0 2020-01-01 08:00:00 0 54511 100 30 10 1 0 2020-01-01 08:00:00 0 54512 101 40 20 0 0 2020-01-02 08:00:00 0 54511 100 30 10 1 0 2020-01-02 08:00:00 0 54512 101 40 20 0 0 2020-01-01 08:00:00 24 54511 100 30 10 1 0 2020-01-01 08:00:00 24 54512 101 40 20</code></pre> <pre><code class="language-python">sta_alt = meb.sta_data(pd.DataFrame({"id":[54511,54512],"alt":[1000,2000]})) print(sta_alt) # 定义只随id变化的属性,例如站点高度</code></pre> <pre><code> level time dtime id lon lat alt 0 NaN NaN NaN 54511 NaN NaN 1000 1 NaN NaN NaN 54512 NaN NaN 2000</code></pre> <pre><code class="language-python">data_alt = meb.combine_expand_IV(sta_all,sta_alt) # 将不随时间时效变化的站点高度 合并到sta_all 中 print(data_alt)</code></pre> <pre><code> level time dtime id lon lat dat alt 0 0 2020-01-01 08:00:00 0 54511 100 30 10 1000 1 0 2020-01-01 08:00:00 0 54512 101 40 20 2000 2 0 2020-01-02 08:00:00 0 54511 100 30 10 1000 3 0 2020-01-02 08:00:00 0 54512 101 40 20 2000 4 0 2020-01-01 08:00:00 24 54511 100 30 10 1000 5 0 2020-01-01 08:00:00 24 54512 101 40 20 2000</code></pre> <pre><code class="language-python">sta_weather_type = meb.sta_data(pd.DataFrame({"time":[datetime.datetime(2020,1,1,8,0),datetime.datetime(2020,1,2,8,0)], "id":[meb.IV,meb.IV], "weather_type":[1,2]})) print(sta_weather_type) # 定义只随时间变化的属性,例如当日的天气的影响系统(以整数表示)</code></pre> <pre><code> level time dtime id lon lat weather_type 0 NaN 2020-01-01 08:00:00 NaN 999999 NaN NaN 1 1 NaN 2020-01-02 08:00:00 NaN 999999 NaN NaN 2</code></pre> <pre><code class="language-python">data_weather_type = meb.combine_expand_IV(sta_all,sta_weather_type) print(data_weather_type) # 当日的天气的影响系统 扩展并合并到sta_all 当中</code></pre> <pre><code> level time dtime id lon lat dat weather_type 0 0 2020-01-01 08:00:00 0 54511 100 30 10 1 1 0 2020-01-01 08:00:00 0 54512 101 40 20 1 2 0 2020-01-02 08:00:00 0 54511 100 30 10 2 3 0 2020-01-02 08:00:00 0 54512 101 40 20 2 4 0 2020-01-01 08:00:00 24 54511 100 30 10 1 5 0 2020-01-01 08:00:00 24 54512 101 40 20 1</code></pre> <h1>网格数据合并</h1> <p><strong>combine_griddata(griddata_list,dtime_list = None)</strong><br /> 在将多种预报的网格数据合并到一个网格数据中时使用该函数。</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>griddata_list</font></strong></td> <td style="text-align: left;">格点数据数据列表</td> </tr> <tr> <td style="text-align: left;"><strong><font face="黑体" color=blue size = 5>dtime_list</font></strong></td> <td style="text-align: left;">如果dtime_list = None, 合并后仅保留所有griddata_list元素中每个网格数据的时效列表的交集,如果dtime_list 不为None,则按照该参数指定合并后的的dtime维坐标列表,合并后缺失的部分数据会以meb.IV (即999999)填充</td> </tr> <tr> <td style="text-align: left;"><font face="黑体" color=blue size=5>return</font></td> <td style="text-align: left;">合并后的网格数据。</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">time_s = datetime.datetime(2021,7,15,8,0) time_e = datetime.datetime(2021,7,20,8,0) grid0 = meb.grid([108,118,0.1],[30,38,0.1]) time1 = time_s dir1 = r"H:\test_data\input\meb\combine_grd_test\ECMWF_HR\APCP\YYYYMMDD\YYMMDDHH.TTT.nc" grd_list = [] while time1 &lt;= time_e: for dh in range(0,241,12): path = meb.get_path(dir1,time1,dh) grd = meb.read_griddata_from_nc(path,grid = grid0,time = time1,dtime = dh,data_name ="ECMWF") # 读取逐个 if grd is not None: grd_list.append(grd) time1 = time1 + datetime.timedelta(hours = 12) grd_ec_acpc = meb.concat(grd_list) grd_ec_rain24 = meb.change(grd_ec_acpc,delta = 24,used_coords="dtime") # 根据累计降水量里计算24小时降水量 grd_ec_rain24 = meb.move_fo_time(grd_ec_rain24,12)</code></pre> <pre><code class="language-python">time1 = time_s dir1 = r"O:\data\grid\NWFD_SCMOC\RAIN24\YYYYMMDD\YYMMDDHH.TTT.nc" grd_list = [] while time1 &lt;= time_e: for dh in range(24,241,24): path = meb.get_path(dir1,time1,dh) grd = meb.read_griddata_from_nc(path,grid = grid0,time = time1,dtime = dh,data_name ="网格预报指导报") if grd is not None: grd_list.append(grd) time1 = time1 + datetime.timedelta(hours = 12) grd_scmoc = meb.concat(grd_list)</code></pre> <pre><code class="language-python">time1 = time_s dir1 = r"O:\data\grid\NWFD_SMERGE\RAIN03\YYYYMMDD\YYMMDDHH.TTT.nc" grd_list = [] while time1 &lt;= time_e: for dh in range(3,169,3): path = meb.get_path(dir1,time1,dh) grd = meb.read_griddata_from_nc(path,grid = grid0,time = time1,dtime = dh,data_name ="国省融合预报") if grd is not None: grd_list.append(grd) time1 = time1 + datetime.timedelta(hours = 12) grd_smerge = meb.concat(grd_list) grd_smerge_24 = meb.sum_of_grd(grd_smerge,used_coords="dtime",span = 24) # 根据3小时降水量里计算24小时降水量</code></pre> <pre><code class="language-python"># 将多种预报合并到一个网格数据里 grd_all = meb.combine_griddata([grd_ec_rain24,grd_scmoc,grd_smerge_24],dtime_list = [24,48,72,96]) </code></pre> <pre><code class="language-python">print(grd_all)</code></pre> <pre><code>&lt;xarray.DataArray 'data0' (member: 3, level: 1, time: 10, dtime: 4, lat: 81, lon: 101)&gt; array([[[[[[ 2.59400000e+00, 2.88400000e+00, 1.60200000e+00, ..., 7.60000000e-02, 3.21000000e-01, 4.58000000e-01], [ 4.63900000e+00, 5.85900000e+00, 9.62000000e-01, ..., 1.60000000e-02, 2.59000000e-01, 8.24000000e-01], [ 6.62200000e+00, 3.31100000e+00, 1.81500000e+00, ..., 2.53841392e-15, 4.50000000e-02, 4.12000000e-01], ..., [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 9.10900000e+00, 1.01930000e+01, 1.11390000e+01], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 1.12450000e+01, 1.05900000e+01, 8.63600000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 7.20200000e+00, 1.03300000e+01, 9.93300000e+00]], [[ 2.36050000e+01, 2.25220000e+01, 1.80360000e+01, ..., 6.10000000e-02, 3.00000000e-02, 1.50000000e-02], [ 2.42310000e+01, 2.88090000e+01, 2.12860000e+01, ..., 4.60000000e-02, 7.60000000e-02, 1.99000000e-01], [ 1.75020000e+01, 2.56500000e+01, 2.76190000e+01, ..., 7.60000000e-02, 6.10000000e-02, 1.38000000e-01], ... [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]], [[ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], ..., [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, ..., 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]]]]]]) Coordinates: * member (member) &lt;U7 'ECMWF' '网格预报指导报' '国省融合预报' * level (level) float64 0.0 * time (time) datetime64[ns] 2021-07-15T20:00:00 ... 2021-07-20T08:00:00 * dtime (dtime) int32 24 48 72 96 * lat (lat) float64 30.0 30.1 30.2 30.3 30.4 ... 37.6 37.7 37.8 37.9 38.0 * lon (lon) float64 108.0 108.1 108.2 108.3 ... 117.7 117.8 117.9 118.0</code></pre>

页面列表

ITEM_HTML