我试图将一个csv文件与年,纬度,长和压力转换成三维netcdf压力(时间,纬度,长)。
但是,我的列表包含重复值 如下所示:
year,lon,lat,pressure
1/1/00,79.4939,34.4713,11981569640
1/1/01,79.4939,34.4713,11870476671
1/1/02,79.4939,34.4713,11858633008
1/1/00,77.9513,35.5452,11254617090
1/1/01,77.9513,35.5452,11267424230
1/1/02,77.9513,35.5452,11297377976
1/1/00,77.9295,35.5188,1031160490
我有同样的年份,一个月,一个月的压力
我的第一个尝试是使用straight:
import pandas as pd
import xarray as xr
csv_file = '.csv'
df = pd.read_csv(csv_file)
df = df.set_index(["year", "lon", "lat"])
xr = df.to_xarray()
nc=xr.to_netcdf('netcdf.nc')`
所以我试着跟随How to convert a csv file to grid with Xarray?,但我崩溃了。
我想我需要重新排列此csv以使其具有唯一值 作为时间的函数,仅改变值 压力。
大概是这样的:
longitude,latitude,1/1/2000,1/1/2001,1/1/2002....
79.4939,34.4713 11981569640 ...
77.9513,35.5452 11254617090 ...
77.9295,35.5188 1031160490 ...
我可以使用“pd.melt”创建我的netcdf:
df = pd.melt(df, id_vars=["year","lon", "lat"], var_name="year", value_name="PRESSURE")
我的档案里有一个两年的例子:
https://1drv.ms/u/s!AhZf0QH5jEVSjWQ7WNCwJsrKBwor?e=UndUkV
使用下面的代码,我想得到:
filename = '13.csv'
colnames = ['year','lon','lat','pressure']
df = pd.read_csv(filename, names = colnames)
df["year"]= pd.to_datetime(df["year"], errors='coerce')
xr = df.set_index(['year','lon','lat']).to_xarray()
#xr['time'].attrs={'units':'hours since 2018-01-01'}
xr['lat'].attrs={'units':'degrees', 'long_name':'Latitude'}
xr['lon'].attrs={'units':'degrees', 'long_name':'Longitude'}
xr['pressure'].attrs={'units':'pa', 'long_name':'Pressure'}
xr.to_netcdf('my_netcdf.nc')
2条答案
按热度按时间yi0zb3m41#
因此,如果您希望将这些数据保存为netCDF(或zarr/HDF 5或任何其他常规网格上的数据存储格式),您有几种选择。
第一种方法是继续执行当前的计划,在这种情况下,您绝对需要以某种方式解决生成的超立方体的总大小问题。您可以使用
sparse
库,并将数据保存为支持稀疏数据的格式。我不推荐使用这种方法。但是如果你真的想要一个3D不规则的网格,在这个网格中以不规则的间隔放置你的站点,您可以这样做。或者,您可以重新网格化您的数据,以强制数据位于规则网格上。这仍然会导致非常大的稀疏数据,但它会比不规则间隔的坐标稍微更有用。例如,如果您希望将数据覆盖在另一个网格化数据集上,这是一个很好的选择。如果您采用这种方法,您可能应该考虑使用pd.cut
将lat/lon值离散化到规则的bin中。第三种选择是将观测/测站/任何点集合视为一个点集合,并为每个点分配一个公共的“点ID”。然后,lat/lon将成为点的一个 * 属性 *,而不是索引坐标。这种方法需要在考虑xarray/netCDF如何工作时进行一些转换,但这种类型的索引通常用于观测数据。其中可能有许多垂直维度,如点ID、位置时间索引、波段等,但每个观测的位置和时间戳实际上是由这些其他维度索引的变量。
为了演示这一点,我设置了一个结构与您的数据集类似的小数据集:
这看起来像这样:
这里最重要的一点是我们需要重新构造数据,这样纬度和经度就可以和一个新的点索引一起移动。你可以用很多种方法来分配这个索引,但是如果你有二维数据(这里是时间的点ID),一个简单的方法是将数据分解成Pandas Dataframe :
现在,我们可以删除latlon索引(稍后将重新拾取它们),并将其替换为工作站ID索引:
现在,让我们跟踪纬度/隆恩,保持它们的顺序(以及station_id值)一致:
现在我们可以重新堆叠表并转换为xarray DataArray:
注意,这里的维度是
(station_id, year)
,而不是(lat, lon)
。我们可以添加(lat,lon),索引为station_id
,作为坐标:现在我们有了所有的数据,年份垂直于站点ID,使得沿着年份维度的数据分析变得容易,但不需要处理稀疏数组。
如果愿意,现在可以记录DataArray & Dataset,然后写入netcdf:
k7fdbhmy2#
使用这些数据无法直接完成所请求的任务--它不是在规则的水平网格上,而是从不同点收集的数据。
因此,要使其成为规则网格,应进行插值,但由于某些区域的数据密度非常高,而另一些区域的数据密度相当小,因此选择步长非常小的规则网格间距并不明智,因为存在超过~40000个唯一经度值和~30000个唯一纬度值。基本上,将其置于规则网格将意味着阵列40 k x 30 k。
我建议只制作包含所有点(不规则间隔)的netCDF,并使用此数据集进行进一步分析。
下面是将输入xlsx文件转换为netCDF的一些代码: