在 Python xarray 中将季节性数据上采样为超过 10 年的每日数据
Upsample seasonal data to daily data over 10 years in Python xarray
我有一个季节性数据的 netCDF 文件。加载到数据集中时,它包含 season
、latitude
和 longitude
维度。
print(dataset_seasonal_nc)
<xarray.Dataset>
Dimensions: (latitude: 106, longitude: 193, season: 4)
Coordinates:
* latitude (latitude) float32 -39.2 -39.149525 ... -33.9
* longitude (longitude) float32 140.8 140.84792 ... 150.0
* season (season) object 'DJF' 'JJA' 'MAM' 'SON'
Data variables:
FFDI 95TH PERCENTILE (season, latitude, longitude) float64 dask.array<shape=(4, 106, 193), chunksize=(4, 106, 193)>
我需要将季节性数据上采样为 10 年的每日数据(例如从 1972 年到 1981 年,总共 3653 天)。这意味着上采样数据集对象应该是:
<xarray.Dataset>
Dimensions: (latitude: 106, longitude: 193, time: 3653)
Coordinates:
* latitude (latitude) float32 -39.2 -39.149525 ... -33.950478 -33.9
* longitude (longitude) float32 140.8 140.84792 140.89584 ... 149.95209 150.0
* time (time) datetime64[ns] 1972-01-01T00:00:00 1972-01-02T00:00:00 1972-01-03T00:00:00 ... 1981-12-30T00:00:00 1981-12-31T00:00:00
Data variables:
FFDI 95TH PERCENTILE (time, latitude, longitude) float64 dask.array<shape=(3653, 106, 193), chunksize=(3653, 106, 193)>
一天的变量应该与该天所在季节的变量相同。这意味着,1972-01-01、1972-02-02 和 1972-02-28 应该具有相同的变量季节 DJF
的价值; 1972-04-01、1972-05-02 和 1972-05-31 的值应与季节 MAM
的值相同。
我正在尝试使用数据集的 resample
函数:
upsampled = dataset_seasonal_nc.resample(time='D').ffill()
但这给了我以下错误:
...\venv\lib\site-packages\xarray\core\dataset.py", line 896, in _construct_dataarray
variable = self._variables[name]
KeyError: 'time'
这似乎是 xarray's advanced label-based indexing 的一个很好的候选者。我认为类似以下内容应该有效:
import pandas as pd
times = pd.date_range('1972', '1982', freq='D', closed='left')
time = xr.DataArray(times, [('time', times)])
upsampled = dataset_seasonal_nc.sel(season=time.dt.season)
这里 time.dt.season
是一个 DataArray,表示与上采样数据集中每个时间关联的季节标签:
In [16]: time.dt.season
Out[16]:
<xarray.DataArray 'season' (time: 3653)>
array(['DJF', 'DJF', 'DJF', ..., 'DJF', 'DJF', 'DJF'],
dtype='|S3')
Coordinates:
* time (time) datetime64[ns] 1972-01-01 1972-01-02 1972-01-03 ...
我有一个季节性数据的 netCDF 文件。加载到数据集中时,它包含 season
、latitude
和 longitude
维度。
print(dataset_seasonal_nc)
<xarray.Dataset>
Dimensions: (latitude: 106, longitude: 193, season: 4)
Coordinates:
* latitude (latitude) float32 -39.2 -39.149525 ... -33.9
* longitude (longitude) float32 140.8 140.84792 ... 150.0
* season (season) object 'DJF' 'JJA' 'MAM' 'SON'
Data variables:
FFDI 95TH PERCENTILE (season, latitude, longitude) float64 dask.array<shape=(4, 106, 193), chunksize=(4, 106, 193)>
我需要将季节性数据上采样为 10 年的每日数据(例如从 1972 年到 1981 年,总共 3653 天)。这意味着上采样数据集对象应该是:
<xarray.Dataset>
Dimensions: (latitude: 106, longitude: 193, time: 3653)
Coordinates:
* latitude (latitude) float32 -39.2 -39.149525 ... -33.950478 -33.9
* longitude (longitude) float32 140.8 140.84792 140.89584 ... 149.95209 150.0
* time (time) datetime64[ns] 1972-01-01T00:00:00 1972-01-02T00:00:00 1972-01-03T00:00:00 ... 1981-12-30T00:00:00 1981-12-31T00:00:00
Data variables:
FFDI 95TH PERCENTILE (time, latitude, longitude) float64 dask.array<shape=(3653, 106, 193), chunksize=(3653, 106, 193)>
一天的变量应该与该天所在季节的变量相同。这意味着,1972-01-01、1972-02-02 和 1972-02-28 应该具有相同的变量季节 DJF
的价值; 1972-04-01、1972-05-02 和 1972-05-31 的值应与季节 MAM
的值相同。
我正在尝试使用数据集的 resample
函数:
upsampled = dataset_seasonal_nc.resample(time='D').ffill()
但这给了我以下错误:
...\venv\lib\site-packages\xarray\core\dataset.py", line 896, in _construct_dataarray
variable = self._variables[name]
KeyError: 'time'
这似乎是 xarray's advanced label-based indexing 的一个很好的候选者。我认为类似以下内容应该有效:
import pandas as pd
times = pd.date_range('1972', '1982', freq='D', closed='left')
time = xr.DataArray(times, [('time', times)])
upsampled = dataset_seasonal_nc.sel(season=time.dt.season)
这里 time.dt.season
是一个 DataArray,表示与上采样数据集中每个时间关联的季节标签:
In [16]: time.dt.season
Out[16]:
<xarray.DataArray 'season' (time: 3653)>
array(['DJF', 'DJF', 'DJF', ..., 'DJF', 'DJF', 'DJF'],
dtype='|S3')
Coordinates:
* time (time) datetime64[ns] 1972-01-01 1972-01-02 1972-01-03 ...