标签: python-xarray

使用 Python 3 的 NetCDF 时间序列切片

我正在尝试从NetCDF文件绘制一周的时间序列数据,但遇到了一些问题。

我正在使用以下软件包:

import netCDF4
from matplotlib import pyplot as plt
import numpy as np
import xarray as xr
import dask
Run Code Online (Sandbox Code Playgroud)

首先我导入两个 .nc 文件:

ds1 = xr.open_dataset('ERA5_forecast_100V_247_2008.nc')
ds2 = xr.open_dataset('ERA5_analysis_100V_247_2008.nc')
Run Code Online (Sandbox Code Playgroud)

然后我使用 xarray 选择时间和网格位置:

dsloc1 = ds1.sel(time='2008-02-10',longitude=2.2,latitude=48.7,method='nearest')
dsloc2 = ds2.sel(time='2008-02-10',longitude=2.2,latitude=48.7,method='nearest')
Run Code Online (Sandbox Code Playgroud)

然后我绘制两个时间序列:

dsloc1['v100'].plot.line('b-',figsize=(15,10))
dsloc2['v100'].plot.line('y-')
Run Code Online (Sandbox Code Playgroud)

这产生了我所期望的:

2008 年 2 月 10 日

但是,当我尝试选择日期范围时,出现一些错误......

dsloc1 = ds1.sel(time=slice('2008-03-01','2008-03-07'),longitude=2.2,latitude=48.7,method='nearest')
dsloc2 = ds2.sel(time=slice('2008-03-01','2008-03-07'),longitude=2.2,latitude=48.7,method='nearest')
Run Code Online (Sandbox Code Playgroud)

我确信这可能是一个语法问题,但我花了比我想要的时间更长的时间来尝试解决它。​​非常感谢收到任何建议!

[编辑] 这是回溯:

---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
<ipython-input-308-c3385fa732ab> in <module>()
      1 # select time and grid location (Feb 10th, 2008, near Paris)
----> 2 dsloc1 = ds1.sel(time=slice('2008-03-01','2008-03-07'),longitude=2.2,latitude=48.7,method='nearest') …
Run Code Online (Sandbox Code Playgroud)

python netcdf python-3.x python-xarray

1
推荐指数
1
解决办法
3106
查看次数

当文件和数据集都具有“时间”分量时,使用 xarray 打开多文件数据集

我不知道如何表达这个问题,但我希望这个例子可以解释它。

我每天都有一系列 netcdf 文件的数据。每个文件都包含数据的时间维度,作为 30 天的预测。

如果我使用以下方法读取一年的数据:

data=xarray.open_mfdataset(files, concat_dim='None', autoclose='True')
Run Code Online (Sandbox Code Playgroud)

然后我得到:

Dimensions:   (None: 365, lat: 110, lon: 100, time: 395)
Run Code Online (Sandbox Code Playgroud)

我只对每个文件的 time = 0 时的值感兴趣,即对于 file = 0,我想要 time = 0 对于 file = 360,我想要 time = 360 等。

基本上我认为我想做的只是从每个文件中读取时间组件的第一个元素,但我似乎不知道如何使用 open_mfdataset 来做到这一点。

即使在读取整个内容后删除不需要的值也可以,但由于 open_mfdataset 连接数据集的方式,我似乎也无法弄清楚这一点。

python python-xarray

1
推荐指数
1
解决办法
5118
查看次数

Python - 如何平滑 xarray 图?

我有一些 NetCDF 文件,我需要从中绘制一些变量。我使用以下小代码来绘制我需要的数据:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
import xarray as xr
os.chdir
fname = "/home/data.nc"
ds = xr.open_dataset(fname)
ds['Evap_obs'].plot()
plt.show()
Run Code Online (Sandbox Code Playgroud)

其工作正常并产生下图:

在此输入图像描述

我现在的问题是这个情节不太可读。因此我希望事先平滑数据。为此我有这个小功能:

def mov_avg(x,window,min_count=None,axis=-1):
    import bottleneck as bn 
    yy=np.ma.filled(np.ma.fix_invalid(x),np.nan)
    yyF=np.ma.masked_all(yy.shape)
    xtmp=bn.move_mean(yy,window,min_count=min_count,axis=axis)
    wd1=(window-1)/2
    ndim = len(yy.shape)
   #print xtmp.shape,ndim,axis,window,wd1
    if ndim ==1 :
   #print wd1,-wd1,wd-1
        yyF[wd1:-wd1]=np.ma.fix_invalid(xtmp[window-1:])

    elif ndim == 2:
        if axis==-1 or axis==1:
            yyF[:,wd1:-wd1]=np.ma.fix_invalid(xtmp[:,window-1:])
        elif axis==0:
            yyF[wd1:-wd1,:]=np.ma.fix_invalid(xtmp[window-1:,:])

    return yyF
Run Code Online (Sandbox Code Playgroud)

然后,当我希望对我的数据运行此函数以使其平滑时,如下所示(使用 7 个时间步长的窗口进行平滑):

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
import xarray as …
Run Code Online (Sandbox Code Playgroud)

python smoothing python-xarray

1
推荐指数
1
解决办法
2676
查看次数

cftime.DatetimeNoLeap 对象无法使用 pandas.to_datetime() 进行转换

我正在使用 xarray 读取多个气候模型数据,自从升级 python 以来,我的代码现在已停止工作。

它失败了,因为某些模型数据具有不同的日历:

In [15]: ds.coords['time'].values[0]
Out[15]: cftime.DatetimeNoLeap(1861, 1, 16, 12, 0, 0, 0, 0, 16)
Run Code Online (Sandbox Code Playgroud)

这意味着 pandas.to_datetime() 失败:

pd.to_datetime(ds.coords['time'].values[0])
TypeError: <type 'cftime._cftime.DatetimeNoLeap'> is not convertible to datetime
Run Code Online (Sandbox Code Playgroud)

有没有解决的办法?

time pandas python-xarray

1
推荐指数
1
解决办法
6837
查看次数

ModuleNotFoundError:没有名为“xarray.core.accessors”的模块

我是 python 新手,并尝试使用 xarray 运行 Metpy 教程,之前没问题,但在我将 xarray 更新到新版本后,它显示错误

我尝试在 anaconda 提示符中创建另一个环境,并安装包括 metpy 在内的每个模块(xarray 已包含在内)

import metpy
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-1-4fe739b01247> in <module>
----> 1 import metpy

C:\ProgramData\Anaconda3\envs\cobaxarray\lib\site-packages\metpy\__init__.py in <module>
     13 
     14 from ._version import get_versions  # noqa: E402
---> 15 from .xarray import *  # noqa: F401, F403
     16 __version__ = get_versions()['version']
     17 del get_versions

C:\ProgramData\Anaconda3\envs\cobaxarray\lib\site-packages\metpy\xarray.py in <module>
     11 
     12 import xarray as xr
---> 13 from xarray.core.accessors import DatetimeAccessor
     14 from xarray.core.indexing import expanded_indexer …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-xarray metpy

1
推荐指数
1
解决办法
8370
查看次数

根据月份选择 xarray 数据集

我有包含以下信息的 xarray 数据集:

Coordinates:
lat: float64 (192)
lon: float64 (288)
time: object (1200) (monthly data)

Data Variables:
tas: (time, lat, lon)
Run Code Online (Sandbox Code Playgroud)

现在我想要特定月份的 tas 值,例如我想要包含一月所有记录的新数据集。

输出数据集将如下所示:

Coordinates:
lat: float64 (192)
lon: float64 (288)
time: object (100) (monthly data of January)

Data Variables:
tas: (time, lat, lon)
Run Code Online (Sandbox Code Playgroud)

我尝试过以前使用过的类似方法:

jan = pd.date_range(start='1979-01-01', periods=41, freq='AS-JAN').date.tolist()
gs_jan = gs.sel(time = jan)

Run Code Online (Sandbox Code Playgroud)

但这在我的情况下不起作用,因为我的日期是在 0001-0100 年,而 pandas 不支持该范围内的日期!

python datetime numpy pandas python-xarray

1
推荐指数
1
解决办法
5671
查看次数

xarray:坐标转换为 datetime64

我有一个 NetCDF4 文件,正在使用 xarray 处理。数据集的“时间”坐标为 dtype=object,我想将其转换为 datetime64,以简化文件中包含的变量的绘制。我的计划是使用以下命令创建一个名为“time1”的新时间坐标

ds.assign_coords(time1=pd.to_datetime(ds.time.values,infer_datetime_format=True))
Run Code Online (Sandbox Code Playgroud)

然后删除旧的。但我得到的新坐标仍然为 dtype=object。 新数据集如下所示

我究竟做错了什么?

datetimeindex python-xarray netcdf4

1
推荐指数
1
解决办法
3722
查看次数

xarray使用cfgrib读取s3上的远程grib文件

crgrib 引擎可以读取远程文件吗?根据马丁·杜兰特的评论,它看起来不像(https://github.com/ecmwf/cfgrib/issues/198#issuecomment-772852412

s3 上托管着一个较小的 grib 文件:https://mf-nwp-models.s3.amazonaws.com/index.html#arpege-world/v2/2021-02-16/00/UGRD/10m/(注意不要单击文件,因为它会下载)。

当我尝试阅读它时,sf3s我得到

import s3fs
import xarray as xr

fs = s3fs.S3FileSystem(anon=True)

uri = "s3://mf-nwp-models/arpege-world/v2/2021-02-16/00/UGRD/10m/0h.grib2"

file = s3fs.S3Map(uri, s3=fs)
ds = xr.open_dataset(file, engine="cfgrib")

Can't create file '<File-like object S3FileSystem, mf-nwp-models/arpege-world/v2/2021-02-16/00/UGRD/10m/0h.grib2>.90c91.idx'
Traceback (most recent call last):
  File "/Users/ray.bell/miniconda/envs/test_env/lib/python3.8/site-packages/cfgrib/messages.py", line 342, in from_indexpath_or_filestream
    with compat_create_exclusive(indexpath) as new_index_file:
  File "/Users/ray.bell/miniconda/envs/test_env/lib/python3.8/contextlib.py", line 113, in __enter__
    return next(self.gen)
  File "/Users/ray.bell/miniconda/envs/test_env/lib/python3.8/site-packages/cfgrib/messages.py", line 274, in compat_create_exclusive
    fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL)
FileNotFoundError: [Errno 2] …
Run Code Online (Sandbox Code Playgroud)

python-xarray cfgrib fsspec

1
推荐指数
1
解决办法
1904
查看次数

zarr 不尊重 xarray 的块大小并恢复到原始块大小

我正在打开一个 zarr 文件,然后将其重新分块,然后将其写回另一个 zarr 存储。然而,当我重新打开它时,它不尊重我之前编写的块大小。这是 jupyter 的代码和输出。知道我在这里做错了什么吗?

bathy_ds = xr.open_zarr('data/bathy_store')
bathy_ds.elevation
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

bathy_ds.chunk(5000).elevation
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

bathy_ds.chunk(5000).to_zarr('data/elevation_store')
new_ds = xr.open_zarr('data/elevation_store')
new_ds.elevation
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

它正在恢复到原始分块,好像我没有完全覆盖它或更改其他一些需要更改的设置。

python python-xarray zarr

1
推荐指数
1
解决办法
107
查看次数

DataArray在简单计算中删除属性

我注意到,如果您有一个 xArray DatarArray 并对其执行简单(!)计算,则属性将被“删除”。

例子:

example            = xr.DataArray(np.array([1,2,3]), attrs={'one':1})
without_Attributes = example*3
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您使用 numpy 特定函数(例如 .round(x), ..),则属性将保留。对此有合理的解释吗?有没有一种方法可以在不丢失其属性的情况下乘以 DataArray?

python-xarray

1
推荐指数
1
解决办法
2747
查看次数

使用 xarray interp 重新投影数据数组?

我已经看了很多interp 函数的 xarray 文档,但我无法真正理解它。我看到这是一个重新投影,但它并不真正适合真实的案例。他们是否有人可以理解它,例如通过将这个数据集重新投影到 webmercator 数据上?

就像这个例子:

import xarray as xr
from pyproj import Transformer

ds = xr.tutorial.open_dataset("air_temperature").isel(time=0)
fig, axes = plt.subplots(ncols=2, figsize=(10, 4))
lon, lat = np.meshgrid(ds.lon, ds.lat)
shp = lon.shape
# reproject the grid
gcs_to_3857 = Transformer.from_crs(4326, 3857, always_xy=True)
x, y = gcs_to_3857.transform(lon.ravel(), lat.ravel())
# future index for a regular raster
X= np.linspace(x.min(), x.max(), shp[1])
Y= np.linspace(y.min(), y.max(), shp[0])   
data["x"] = xr.DataArray(np.reshape(x, shp), dims=("lat", "lon"))
data["y"] = xr.DataArray(np.reshape(y, shp), dims=("lat", "lon"))

Run Code Online (Sandbox Code Playgroud)

而在这里,我被困住了

应该是类似的东西ds.interp(x=X,y=Y),但数组是在经纬度上索引的

这对我来说有点令人困惑......

raster map-projections python-xarray

1
推荐指数
1
解决办法
1326
查看次数

如何控制 xarray 中面网格行和/或列的顺序?

我正在尝试更改用于在 xarray 中制作构面网格的变量的顺序。例如,我将[a,b,c,d ] 作为列名称。我想将其重新排序为[c,d,a,b]。不幸的是,与seaborn不同,我无法在 xarray 绘图函数中找到 col_order 或 row_order 等参数(

\n
\n

https://xarray.pydata.org/en/stable/ generated/xarray.plot.FacetGrid.html

\n
\n

更新: \n为了帮助自己更好地解释我需要什么,我从 xarray 的用户指南中获取了下面的示例:\n在下面的示例中,我需要更改月份的位置。我的意思是,例如,我想将第 7 个月作为第一列,将第 2 个月作为第 5 列,依此类推。在此输入图像描述

\n
import matplotlib as mpl\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport xarray as xr\nds = xr.tutorial.open_dataset("air_temperature.nc").rename({"air": "Tair"})\n\n# we will add a gradient field with appropriate attributes\nds["dTdx"] = ds.Tair.differentiate("lon") / 110e3 / np.cos(ds.lat * np.pi / 180)\nds["dTdy"] = ds.Tair.differentiate("lat") / 105e3\nds.dTdx.attrs = {"long_name": "$\xe2\x88\x82T/\xe2\x88\x82x$", "units": "\xc2\xb0C/m"}\nds.dTdy.attrs = {"long_name": "$\xe2\x88\x82T/\xe2\x88\x82y$", …
Run Code Online (Sandbox Code Playgroud)

python matplotlib seaborn python-xarray

1
推荐指数
1
解决办法
420
查看次数

如何在使用 xarray 加载 NETCDF 文件时解码时间变量

我有一个 netcdf 文件,给出了从 1948 年到 2008 年的月降水值。时间变量的格式如下:

float time(time) ;
        time:units = "months since 1948-01-01 00:00:00" ;
        time:time_origin = "01-JAN-1948:00:00:00" ;
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 Xarray 使用以下命令打开数据集时

ds=xr.open_dataset("C:/Users/vsri/Downloads/prcp_monthly_1948-2008.nc")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

ValueError: unable to decode time units 'months since 1948-01-01 00:00:00' with the default calendar. Try opening your dataset with decode_times=False.
Run Code Online (Sandbox Code Playgroud)

如果我使用 decode_Times=False 参数,则时间变量会分配一个浮点值(如下所示)

 Coordinates:
      * longitude  (longitude) float32 0.25 0.75 1.25 1.75 ... 358.75 359.25 359.75
      * latitude   (latitude) float32 -89.75 -89.25 -88.75 ... 88.75 89.25 89.75
      * z       (z) float32 0.0
      * time …
Run Code Online (Sandbox Code Playgroud)

datetime netcdf python-xarray

0
推荐指数
1
解决办法
1911
查看次数