Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python 3的NetCDF时间序列切片_Python_Python 3.x_Netcdf_Python Xarray - Fatal编程技术网

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

使用Python 3的NetCDF时间序列切片,python,python-3.x,netcdf,python-xarray,Python,Python 3.x,Netcdf,Python Xarray,我试图从NetCDF文件中绘制一周的时间序列数据,但遇到了一些问题 我正在使用以下软件包: import netCDF4 from matplotlib import pyplot as plt import numpy as np import xarray as xr import dask 首先,我导入两个.nc文件: ds1 = xr.open_dataset('ERA5_forecast_100V_247_2008.nc') ds2 = xr.open_dataset('ERA5_a

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

我正在使用以下软件包:

import netCDF4
from matplotlib import pyplot as plt
import numpy as np
import xarray as xr
import dask
首先,我导入两个.nc文件:

ds1 = xr.open_dataset('ERA5_forecast_100V_247_2008.nc')
ds2 = xr.open_dataset('ERA5_analysis_100V_247_2008.nc')
然后,我使用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')
然后我绘制了两个时间序列:

dsloc1['v100'].plot.line('b-',figsize=(15,10))
dsloc2['v100'].plot.line('y-')
这产生了我所期望的:

但是,当我尝试选择一系列日期时,会出现一些错误

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')
我肯定这可能是语法方面的问题,但我花了太多时间试图解决这个问题。。感谢您的建议

[编辑]以下是回溯:

---------------------------------------------------------------------------
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')
      3 dsloc2 = ds2.sel(time=slice('2008-03-01','2008-03-07'),longitude=2.2,latitude=48.7,method='nearest')

/usr/local/lib/python3.6/site-packages/xarray/core/dataset.py in sel(self, indexers, method, tolerance, drop, **indexers_kwargs)
   1507         indexers = either_dict_or_kwargs(indexers, indexers_kwargs, 'sel')
   1508         pos_indexers, new_indexes = remap_label_indexers(
-> 1509             self, indexers=indexers, method=method, tolerance=tolerance)
   1510         result = self.isel(indexers=pos_indexers, drop=drop)
   1511         return result._replace_indexes(new_indexes)

/usr/local/lib/python3.6/site-packages/xarray/core/coordinates.py in remap_label_indexers(obj, indexers, method, tolerance, **indexers_kwargs)
    353 
    354     pos_indexers, new_indexes = indexing.remap_label_indexers(
--> 355         obj, v_indexers, method=method, tolerance=tolerance
    356     )
    357     # attach indexer's coordinate to pos_indexers

/usr/local/lib/python3.6/site-packages/xarray/core/indexing.py in remap_label_indexers(data_obj, indexers, method, tolerance)
    248         else:
    249             idxr, new_idx = convert_label_indexer(index, label,
--> 250                                                   dim, method, tolerance)
    251             pos_indexers[dim] = idxr
    252             if new_idx is not None:

/usr/local/lib/python3.6/site-packages/xarray/core/indexing.py in convert_label_indexer(index, label, index_name, method, tolerance)
    132         if method is not None or tolerance is not None:
    133             raise NotImplementedError(
--> 134                 'cannot use ``method`` argument if any indexers are '
    135                 'slice objects')
    136         indexer = index.slice_indexer(_sanitize_slice_element(label.start),

NotImplementedError: cannot use ``method`` argument if any indexers are slice objects
似乎根本不支持使用时间片结合方法='nearest'的sel:

如果任何索引器都是切片对象,则无法使用方法参数

这在某种程度上是有道理的,因为为切片选择最近的似乎有点奇怪

您可以通过分两步执行sel来解决此问题,即首先选择时间片,然后从该时间片中选择位置或其他方式。我不确定这是否是最好的解决方案,但至少它是有效的

一些ERA5数据的快速示例:

import xarray as xr

ds1 = xr.open_dataset('20160502_cabauw_model_fc.nc')

# Works:
dsloc1 = ds1.sel(time='2016-05-02 10:00', longitude=4.9, latitude=51.2, method='nearest')

# Doesn't work:
#dsloc2 = ds1.sel(time=slice('2016-05-02 10:00', '2016-05-02 12:00'), longitude=4.9, latitude=51.2, method='nearest')

# Works:
tmp    = ds1.sel(time=slice('2016-05-02 10:00', '2016-05-02 12:00'))
dsloc2 = tmp.sel(longitude=4.9, latitude=51.2, method='nearest')
这会导致如下结果:

In [23]: dsloc2
Out[23]: 
<xarray.Dataset>
Dimensions:    (level: 137, time: 3)
Coordinates:
    longitude  float32 4.8
    latitude   float32 51.3
  * level      (level) int32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
  * time       (time) datetime64[ns] 2016-05-02T10:00:00 2016-05-02T11:00:00 ...
Data variables:
    z          (time, level) float32 ...
似乎根本不支持使用时间片结合方法='nearest'的sel:

如果任何索引器都是切片对象,则无法使用方法参数

这在某种程度上是有道理的,因为为切片选择最近的似乎有点奇怪

您可以通过分两步执行sel来解决此问题,即首先选择时间片,然后从该时间片中选择位置或其他方式。我不确定这是否是最好的解决方案,但至少它是有效的

一些ERA5数据的快速示例:

import xarray as xr

ds1 = xr.open_dataset('20160502_cabauw_model_fc.nc')

# Works:
dsloc1 = ds1.sel(time='2016-05-02 10:00', longitude=4.9, latitude=51.2, method='nearest')

# Doesn't work:
#dsloc2 = ds1.sel(time=slice('2016-05-02 10:00', '2016-05-02 12:00'), longitude=4.9, latitude=51.2, method='nearest')

# Works:
tmp    = ds1.sel(time=slice('2016-05-02 10:00', '2016-05-02 12:00'))
dsloc2 = tmp.sel(longitude=4.9, latitude=51.2, method='nearest')
这会导致如下结果:

In [23]: dsloc2
Out[23]: 
<xarray.Dataset>
Dimensions:    (level: 137, time: 3)
Coordinates:
    longitude  float32 4.8
    latitude   float32 51.3
  * level      (level) int32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
  * time       (time) datetime64[ns] 2016-05-02T10:00:00 2016-05-02T11:00:00 ...
Data variables:
    z          (time, level) float32 ...

你能添加回溯+错误吗?@Bart刚刚添加了回溯,干杯:你能添加回溯+错误吗?@Bart刚刚添加了回溯,干杯:谢谢你的回复。将其分为两个步骤非常有效,非常有意义。我似乎还不能对你的评论投赞成票,但谢谢你花时间回复!谢谢你的回复。将其分为两个步骤非常有效,非常有意义。我似乎还不能对你的评论投赞成票,但谢谢你花时间回复!