小编jha*_*man的帖子

使用xarray加入/合并多个NetCDF文件

我有一个文件夹,包含2006 - 2001年的NetCDF文件,十年块(2011-2020,2021-2030等).

我想创建一个新的NetCDF文件,其中包含连接在一起的所有这些文件.到目前为止,我已阅读过文件:

ds = xarray.open_dataset('Path/to/file/20062010.nc')
ds1 = xarray.open_dataset('Path/to/file/20112020.nc')
etc.
Run Code Online (Sandbox Code Playgroud)

然后像这样合并这些:

dsmerged = xarray.merge([ds,ds1])
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是很笨重,并且必须有一种更简单的方法来自动化这个过程,因为我将为许多不同文件夹的文件夹执行此操作.有没有更有效的方法来做到这一点?

编辑:

尝试使用glob加入这些文件:

for filename in glob.glob('path/to/file/.*nc'):
    dsmerged = xarray.merge([filename])
Run Code Online (Sandbox Code Playgroud)

给出错误:

AttributeError: 'str' object has no attribute 'items'
Run Code Online (Sandbox Code Playgroud)

这只是读取文件名的文本,而不是实际文件本身,所以它不能合并它.如何打开,存储为变量,然后合并而不是一点一点地进行合并?

python merge join python-xarray

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

在heroku上服务交互式散景图

我正试图bokeh通过heroku 提供互动人物.我试图提供的数字基本上等同于这个(例如,代码).我是两个人的新手bokeh,heroku所以我很确定我错过了一些非常基本的东西 - 我认为我想要做的事应该非常简单.

首先,我可以使用bokeh serve --show myapp命令在本地提供我的数字.myapp包含该bokeh图的python模块的名称在哪里.请注意,一旦构建了图形并且服务器正在运行,该--show标志只会提示bokeh打开浏览器窗口.

接下来,我heroku按照Heroku - Python入门教程中的步骤设置了一个帐户并创建了我的第一个应用程序.我的git存储库包括myapp一个requirements.txt文件和Procfile.

唉,有些东西不起作用,我很难过.我已经尝试了一些不同的选项Procfile,但没有一个有效.由于bokeh serve ...命令启动服务器,不应该Profile看起来像这样做伎俩:

web: bokeh serve --port $PORT myapp
Run Code Online (Sandbox Code Playgroud)

那会有用吗?也许我错过了一些东西,我需要创建一个flask包装我的bokeh应用程序的应用程序,但据我所知,这似乎没有必要.也许有人知道一个很好的教程,将所有这些步骤结合在一起,我还没有找到一个完整的教程.

更新: 我在下面粘贴了一些heroku日志.你是如何处理这个--host whitelist问题的?

2016-07-17T05:00:46.513139+00:00 heroku[slug-compiler]: Slug compilation started
2016-07-17T05:00:46.366909+00:00 heroku[api]: Deploy 9b63d8a by me@me.com …
Run Code Online (Sandbox Code Playgroud)

python heroku flask bokeh

8
推荐指数
2
解决办法
2191
查看次数

pytest因ModuleNotFoundError和未使用插件的名称而失败

我维护一个开源库xarray,它使用pytest在Travis-CI上运行集成测试.我们使用stack conda安装科学Python.

今天早些时候,我们的五个测试版本中的两个(Python 3.5和3.6,但不是Python 2.7或3.4)开始失败,没有明显的原因.pytest本身失败了,带着神秘的引用:

$ py.test xarray --cov=xarray --cov-config ci/.coveragerc --cov-report term-missing --verbose $EXTRA_FLAGS
Traceback (most recent call last):
  File "/home/travis/miniconda/envs/test_env/bin/py.test", line 6, in <module>
    sys.exit(py.test.main())
  File "/home/travis/miniconda/envs/test_env/lib/python3.6/site-packages/_pytest/config.py", line 49, in main
    config = _prepareconfig(args, plugins)
  File "/home/travis/miniconda/envs/test_env/lib/python3.6/site-packages/_pytest/config.py", line 168, in _prepareconfig
    pluginmanager=pluginmanager, args=args)
  File "/home/travis/miniconda/envs/test_env/lib/python3.6/site-packages/_pytest/vendored_packages/pluggy.py", line 745, in __call__
    return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
  File "/home/travis/miniconda/envs/test_env/lib/python3.6/site-packages/_pytest/vendored_packages/pluggy.py", line 339, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/home/travis/miniconda/envs/test_env/lib/python3.6/site-packages/_pytest/vendored_packages/pluggy.py", line 334, in <lambda>
    _MultiCall(methods, kwargs, hook.spec_opts).execute()
  File …
Run Code Online (Sandbox Code Playgroud)

pytest travis-ci conda python-hypothesis

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

使用 xarray 打开 netcdf 文件时如何禁用缓存?

我正在尝试设置一个性能测试来重复读取具有不同分块配置的 netcdf 文件,以最终确定特定用例的最佳块大小。我遇到的一个问题是,当使用xarray.open_dataset()读取文件时,即使缓存设置为 False,它仍然以某种方式将缓存存储在内存中。我知道这是基于两个指标的情况:

  • 第一次运行时读取总是很慢。
  • 使用RamMap应用程序,我看到即使关闭数据集,打开的文件仍在内存中。

这是我运行的代码:

ds = xr.open_dataset("path/to/netcdf/file", engine='h5netcdf', cache=False)

lat_dim = 2160
lon_dim = 4320
time_dim = 46
read_chunk_size = 2160

data = np.empty((time_dim, lat_dim, lon_dim))
data[0:time_dim, 0:read_chunk_size, 0:read_chunk_size] = \
ds['value'][0:time_dim, 0:read_chunk_size, 0:read_chunk_size]

ds.close()
Run Code Online (Sandbox Code Playgroud)

很明显,我对 xarray 中缓存的理解非常少。因此,如果有人能向我解释它的实际工作原理,以及如何在多运行性能测试中利用它,我将不胜感激。

python caching performance-testing netcdf python-xarray

6
推荐指数
0
解决办法
356
查看次数

使用xarray从netcdf提取最近的经度和时间值

我有一个带foll的netCDF文件。结构体:

<xarray.Dataset>
Dimensions:    (latitude: 94, longitude: 192, time: 366)
Coordinates:
  * longitude  (longitude) float32 -180.0 -178.125 -176.25 -174.375 -172.5 ...
  * latitude   (latitude) float32 88.5419 86.6532 84.7532 82.8508 80.9474 ...
  * time       (time) datetime64[ns] 2016-01-01 2016-01-02 2016-01-03 ...
Data variables:
    m2t      (time, latitude, longitude) float64 246.5 246.4 246.4 246.4
    pre      (time, latitude, longitude) float64 9.988e-08 9.988e-08 ...
Attributes:
    Conventions: CF-1.0
Run Code Online (Sandbox Code Playgroud)

如何为特定经度和纬度(例如86.45,-156.25)和时间(例如2016-01-10)提取网格单元的值?确切的纬度/经度值可能不在坐标中,在这种情况下,我们需要最接近的纬度/经度值

我可以像这样提取特定经度的值:

_hndl_nc.sel(longitude=(_hndl_nc.longitude == -20))
Run Code Online (Sandbox Code Playgroud)

但是,由于经度坐标中不存在-20,因此此方法无效。

python netcdf python-xarray

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

在给定坐标的不规则网格上查找最近的地面像素

我使用在不规则二维网格上组织的卫星数据,其尺寸为扫描线(沿轨道尺寸)和地面像素(跨轨道尺寸)。每个地面像素的纬度和经度信息存储在辅助坐标变量中。

给定一个(纬度,经度)点,我想识别我的数据集上最接近的地面像素。

让我们构建一个 10x10 的玩具数据集:

import numpy as np
import xarray as xr
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
%matplotlib inline

lon, lat = np.meshgrid(np.linspace(-20, 20, 10), 
                       np.linspace(30, 60, 10))
lon += lat/10
lat += lon/10
da = xr.DataArray(data = np.random.normal(0,1,100).reshape(10,10), 
                  dims=['scanline', 'ground_pixel'],
                  coords = {'lat': (('scanline', 'ground_pixel'), lat),
                            'lon': (('scanline', 'ground_pixel'), lon)})

ax = plt.subplot(projection=ccrs.PlateCarree())
da.plot.pcolormesh('lon', 'lat', ax=ax, cmap=plt.cm.get_cmap('Blues'), 
                   infer_intervals=True);
ax.scatter(lon, lat, transform=ccrs.PlateCarree())
ax.coastlines()
ax.gridlines(draw_labels=True)
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

欧洲

请注意,纬度/经度坐标标识中心像素,像素边界由 xarray 自动推断。

现在,假设我想识别距离罗马最近的地面像素。

到目前为止,我想到的最好方法是在堆叠的扁平纬度/经度数组上使用 scipy 的 kdtree:

from scipy import …
Run Code Online (Sandbox Code Playgroud)

python numpy satellite scipy python-xarray

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

Python:循环连接多个 (200+) netCDF 文件以形成一个文件

我有大量(200 多个)netCDF 文件,这些文件按日期/时间进行索引,并包含单个位置 3 小时的降水测量值,涵盖 20 年,下面显示了一个简短的示例。

                        ppt     latitude    longitude
time            
2017-03-01 00:00:00     0.00    16.625      -62.375
2017-03-01 03:00:00     0.00    16.625      -62.375
2017-03-01 06:00:00     0.00    16.625      -62.375
2017-03-01 09:00:00     0.00    16.625      -62.375
2017-03-01 12:00:00     0.00    16.625      -62.375
2017-03-01 15:00:00     0.00    16.625      -62.375
Run Code Online (Sandbox Code Playgroud)

每个文件都包含一个月的数据。我的目标是将所有这些文件连接成一个包含 20 年所有数据的文件。到目前为止,我已经推断出一种可能的前进方式是从每个 netCDF 文件中提取数据并将它们放入一个数据帧中:

import xarray as xr
import pandas as pd

ds = xr.open_dataset('ppt_1_201703.nc')
df = ds.to_dataframe()
Run Code Online (Sandbox Code Playgroud)

如果我有少量文件,使用 concat([df, df2, df3]) 就足够了,我会手动从每个 netCDF 文件中提取数据。然而,对于如此大量的文件,这种方法至少可以说是耗时的。

到目前为止,我的想法是相信最好的方法是一个 for 循环,它根据每个文件的名称循环遍历每个文件并为每个文件生成一个数据帧。然后我需要另一个 for 循环来连接每个数据帧。

我正在纠结如何构建这些循环。文件名是这样的:

ppt_1_199801.nc
ppt_1_199802.nc
ppt_1_199803.nc
...
ppt_1_201610.nc
ppt_1_201611.nc
ppt_1_201612.nc …
Run Code Online (Sandbox Code Playgroud)

python netcdf pandas python-xarray

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