合并
<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 <= 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><xarray.DataArray 'data0' (member: 1, level: 1, time: 11, dtime: 21, lat: 81, lon: 101)>
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) <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 = "inner")</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 <= 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 <= 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 <= 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><xarray.DataArray 'data0' (member: 3, level: 1, time: 10, dtime: 4, lat: 81, lon: 101)>
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) <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>