xarray - 将字符串存储为 'string' 数据类型而不是 'char'(n 维字符数组)Python2.7
xarray - store strings as 'string' data-type instead of 'char' (n-dimensional character arrays) for Python2.7
我正在使用 xarray 将文本文件转换为 netCDF 格式。当我使用 netCDF4 格式和 Python3 时,它将字符串变量存储为字符串,但当我使用 Python2 时,它将它们存储为 n 维字符数组。我试图在编码中设置 dtype='str' ,但没有任何区别。有没有办法使用 Python2 使这些变量具有字符串数据类型?如有任何想法,我们将不胜感激。
这是我的代码:
import pandas as pd
import xarray as xr
column_names = ['timestamp', 'air_temp', 'vtempdiff', 'rh', 'pressure', 'wind_dir', 'wind_spd']
df = pd.read_csv(args.input_file, skiprows = 1, header=None, names = column_names)
ds = xr.Dataset.from_dataframe(df)
encoding = {'timestamp': {'dtype': 'str'},
'air_temp': {'_FillValue': 9.96921e+36, 'dtype': 'f4'}
}
ds.to_netcdf(op_file.nc, format = 'NETCDF4', unlimited_dims={'time':True}, encoding = encoding)
当我使用 Python3.6 执行 op_file.nc 的 ncdump 时,我得到:
netcdf op_file {
dimensions:
time = UNLIMITED ; // (24 currently)
variables:
string timestamp(time) ;
float air_temp(time) ;
.
.
.
当我使用 Python2.7 时,我得到:
netcdf op_file {
dimensions:
time = UNLIMITED ; // (24 currently)
string20 = 20 ;
variables:
char timestamp(time, string20) ;
timestamp:_Encoding = "utf-8" ;
float air_temp(time) ;
.
.
.
示例输入文件如下所示:
# Fields: stamp,AGO-4.air_temp,AGO-4.vtempdiff,AGO-4.rh,AGO-4.pressure,AGO-4.wind_dir,AGO-4.wind_spd
2016-11-30T00:00:00Z,-36.50,,56.00,624.60,269.00,5.80
2016-11-30T01:00:00Z,-35.70,,55.80,624.70,265.00,5.90
Xarray 将 Python 2 的 str
/bytes
类型映射到 NetCDF 的 NC_CHAR
类型。这两种类型都表示单字节字符数据(通常是 ASCII),因此这具有一定的意义。
要获取 netCDF 字符串 NC_STRING
,您需要传递 unicode
数据(str
on Python 3)。您可以通过使用 .astype(unicode)
或通过在 encoding
.
中传递 {'dtype': unicode}
将时间戳列显式强制为 unicode 来获得此信息
我正在使用 xarray 将文本文件转换为 netCDF 格式。当我使用 netCDF4 格式和 Python3 时,它将字符串变量存储为字符串,但当我使用 Python2 时,它将它们存储为 n 维字符数组。我试图在编码中设置 dtype='str' ,但没有任何区别。有没有办法使用 Python2 使这些变量具有字符串数据类型?如有任何想法,我们将不胜感激。
这是我的代码:
import pandas as pd
import xarray as xr
column_names = ['timestamp', 'air_temp', 'vtempdiff', 'rh', 'pressure', 'wind_dir', 'wind_spd']
df = pd.read_csv(args.input_file, skiprows = 1, header=None, names = column_names)
ds = xr.Dataset.from_dataframe(df)
encoding = {'timestamp': {'dtype': 'str'},
'air_temp': {'_FillValue': 9.96921e+36, 'dtype': 'f4'}
}
ds.to_netcdf(op_file.nc, format = 'NETCDF4', unlimited_dims={'time':True}, encoding = encoding)
当我使用 Python3.6 执行 op_file.nc 的 ncdump 时,我得到:
netcdf op_file {
dimensions:
time = UNLIMITED ; // (24 currently)
variables:
string timestamp(time) ;
float air_temp(time) ;
.
.
.
当我使用 Python2.7 时,我得到:
netcdf op_file {
dimensions:
time = UNLIMITED ; // (24 currently)
string20 = 20 ;
variables:
char timestamp(time, string20) ;
timestamp:_Encoding = "utf-8" ;
float air_temp(time) ;
.
.
.
示例输入文件如下所示:
# Fields: stamp,AGO-4.air_temp,AGO-4.vtempdiff,AGO-4.rh,AGO-4.pressure,AGO-4.wind_dir,AGO-4.wind_spd
2016-11-30T00:00:00Z,-36.50,,56.00,624.60,269.00,5.80
2016-11-30T01:00:00Z,-35.70,,55.80,624.70,265.00,5.90
Xarray 将 Python 2 的 str
/bytes
类型映射到 NetCDF 的 NC_CHAR
类型。这两种类型都表示单字节字符数据(通常是 ASCII),因此这具有一定的意义。
要获取 netCDF 字符串 NC_STRING
,您需要传递 unicode
数据(str
on Python 3)。您可以通过使用 .astype(unicode)
或通过在 encoding
.
{'dtype': unicode}
将时间戳列显式强制为 unicode 来获得此信息