कई साल netcdf से मासिक औसत कंप्यूटिंग xarray

Dec 18 2020

मेरे पास ERA5 से 2 मी तापमान नेटबैंक फाइल है जो 2000 से 2019 तक 04 से 10 महीनों तक चलती है, जो कुल 13680 टाइमस्टेप और 61x161 लेट-लोन आयाम देती है। मैं प्रत्येक वर्ष के लिए सभी दैनिक टाइमस्टेप्स का मासिक मतलब अलग से करना चाहता हूं। उदाहरण के लिए, हमारे पास डेटा का मासिक साधन 2000 के अप्रैल में, 2000 के मई में और इसके बाद होगा। मैंने xarray के पुन: उपयोग के साथ निम्न कोड की कोशिश की है, लेकिन दो समस्याएं होती हैं।

  1. किसी कारण से सभी वर्षों के लिए माध्य लगता है।
  2. प्रतिसाद समारोह में ०१, ०२, ०३, ११ और १२ महीने बनते हैं, इसके बावजूद इसका कोई डेटा नहीं है!

यहाँ मैं बात कर रहा हूँ:

import xarray as xr
ds = xr.open_dataset(netcdf)
monthly_data=ds.resample(time='1M').mean()

हम टाइमस्टैम्प को देख सकते हैं जो मासिक टाइमस्टेप दिखाता है, जिसमें गैर-संबंधित महीने भी शामिल हैं।

print(np.array(monthly_data.time))
array(['2000-04-30T00:00:00.000000000', '2000-05-31T00:00:00.000000000',
       '2000-06-30T00:00:00.000000000', '2000-07-31T00:00:00.000000000',
       '2000-08-31T00:00:00.000000000', '2000-09-30T00:00:00.000000000',
       '2000-10-31T00:00:00.000000000', '2000-11-30T00:00:00.000000000',
       '2000-12-31T00:00:00.000000000', '2001-01-31T00:00:00.000000000',

तापमान की सामग्री को सत्यापित करने के लिए, मैंने डेटा को डेटाफ़्रेम में बदल दिया।

temp_ar = np.array(monthly_data.t2m)    
print(pd.DataFrame(temp_ar[0,:,:]).head())
          0           1           2    ...         158         159         160
0  270.940613  270.911652  270.926727  ...         NaN         NaN         NaN
1  271.294952  271.256744  271.250946  ...  272.948608  272.974731  272.998535
2  271.416779  271.457214  271.483459  ...  273.123169  273.079285  273.058563
3  271.848755  271.791382  271.784058  ...         NaN  273.264038         NaN
4  272.226837  272.144928  272.123016  ...         NaN         NaN         NaN

print(pd.DataFrame(temp_ar[1,:,:]).head())
   0    1    2    3    4    5    6    ...  154  155  156  157  158  159  160
0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  ...  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  ...  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  ...  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  ...  NaN  NaN  NaN  NaN  NaN  NaN  NaN
4  NaN  NaN  NaN  NaN  NaN  NaN  NaN  ...  NaN  NaN  NaN  NaN  NaN  NaN  NaN

दूसरा सरणी (जो 2000 के महीने 05 से मेल खाती है) में नाम नहीं होना चाहिए, लेकिन यह अन्य सभी टाइमस्टेप (किसी कारण से पिछले एक को छोड़कर) के लिए ऐसा करता है। किसी को पता होगा कि ऐसा क्यों हो रहा है?

यहाँ मूल डाटासेट है

print(ds)
<xarray.Dataset>
Dimensions:    (latitude: 61, longitude: 161, time: 13680)
Coordinates:
  * longitude  (longitude) float32 -80.0 -79.9 -79.8 -79.7 ... -64.2 -64.1 -64.0
  * latitude   (latitude) float32 50.0 49.9 49.8 49.7 ... 44.3 44.2 44.1 44.0
  * time       (time) datetime64[ns] 2000-04-01 ... 2018-10-30T23:00:00
Data variables:
    t2m        (time, latitude, longitude) float32 ...
Attributes:
    Conventions:  CF-1.6
    history:      2020-12-07 03:50:31 GMT by grib_to_netcdf-2.16.0: /opt/ecmw...

कोई मदद होगी। शायद मुझे कोई और तरीका आजमाना चाहिए? चियर्स!

जवाब

2 lhoupert Dec 18 2020 at 14:23

मुझे लगता है कि विधि का उपयोग करने का कोई आसान तरीका होगाgroupby

उदाहरण:

da = xr.DataArray(
    np.linspace(0, 1673, num=1674),
    coords=[pd.date_range("1/1/2000", "31/07/2004", freq="D")],
    dims="time",
)
da

आउटपुट:

<xarray.DataArray (time: 1674)>
array([0.000e+00, 1.000e+00, 2.000e+00, ..., 1.671e+03, 1.672e+03, 1.673e+03])
Coordinates:
  * time     (time) datetime64[ns] 2000-01-01 2000-01-02 ... 2004-07-31

वार्षिक मतलब के लिए आप कर सकते हैं:

da.groupby('time.year').mean()

आउटपुट:

<xarray.DataArray (year: 5)>
array([ 182.5,  548. ,  913. , 1278. , 1567. ])
Coordinates:
  * year     (year) int64 2000 2001 2002 2003 2004

विभिन्न वर्ष के प्रति माह के लिए, आप एक बहु-सूचकांक बना सकते हैं:

year_month_idx = pd.MultiIndex.from_arrays([da['time.year'], da['time.month']])
da.coords['year_month'] = ('time', year_month_idx)
da.groupby('year_month').mean()

आउटपुट:

<xarray.DataArray (year_month: 55)>
array([  15. ,   45. ,   75. ,  105.5,  136. ,  166.5,  197. ,  228. ,  258.5,
        289. ,  319.5,  350. ,  381. ,  410.5,  440. ,  470.5,  501. ,  531.5,
        562. ,  593. ,  623.5,  654. ,  684.5,  715. ,  746. ,  775.5,  805. ,
        835.5,  866. ,  896.5,  927. ,  958. ,  988.5, 1019. , 1049.5, 1080. ,
       1111. , 1140.5, 1170. , 1200.5, 1231. , 1261.5, 1292. , 1323. , 1353.5,
       1384. , 1414.5, 1445. , 1476. , 1506. , 1536. , 1566.5, 1597. , 1627.5,
       1658. ])
Coordinates:
 * year_month          (year_month) MultiIndex
 * year_month_level_0  (year_month) int64 2000 2000 2000 ... 2002 2002 2002
 * year_month_level_1  (year_month) int64 1 2 3 4 5 6 7 8 ... 11 12 1 2 3 4 5 6