【问题标题】:How to save multi-dimentional array values into CSV/Test file Python如何将多维数组值保存到 CSV/文本文件 Python
【发布时间】:2018-04-17 11:09:53
【问题描述】:

我使用的是 winpy 6.3。我使用“xarray”提取了一个时间序列变量数据集(每天 1950-2004 年),该数据集基于我感兴趣的区域,使用 netcdf 文件中的纬度/经度边界。

代码:

clt_subset = nc.variables['clt'][:,latli:latui , lonli:lonui]

print(clt_subset):
[[[  96.07967377   32.5813179    30.86773872 ...,   99.99996185
     99.99997711   99.99997711]
  [  93.75789642   86.78536987   46.51786423 ...,   99.99756622
     99.99769592   99.99931335]
  [  99.19438171   99.71717834   97.34263611 ...,   99.99707794
     99.99639893   99.93907928]
  ..., 
  [   7.65702724    1.1814307     4.02125835 ...,   39.58660126
     37.71473694   42.10451508]
  [   9.48283291   18.4249897    45.22411346 ...,   70.95629883
     72.82741547   72.89440155]
  [  33.2973175    46.50339508   88.39287567 ...,   98.50241089
     98.47457123   91.32685089]]

 [[  85.40306854   28.19069862   19.56433678 ...,   99.96898651
     99.99860382  100.        ]
  [  80.49911499   49.17562485   25.18140984 ...,   99.99198151
     99.99337006   99.99979401]
  [  99.9821167    91.44667816   78.83125305 ...,   99.99027252
     99.99280548   99.99995422]
  ..., 

so on..............

print (clt_subset.shape)
(20075, 22, 25)

现在我无法使用不同列 (22*25) 中的“日期时间”函数将每个网格(纬度/经度)组合的时间序列值(行)保存到 csv 文件中。代码在这里:

# 2. Specify the exact time period you want:
start = datetime.datetime(1950,1,1,0,0,0)
stop = datetime.datetime(2004,12,1,0,0,0)

istart = netCDF4.date2index(start,time_var,select='nearest')
istop = netCDF4.date2index(stop,time_var,select='nearest')
print (istart,istop)

hs = clt_subset[istart:istop,latli:latui , lonli:lonui]
tim = dtime[istart:istop]

ts = pd.Series(hs,index=tim,name=clt_subset)
ts.to_csv('time_series_from_netcdf.csv')

在执行此操作时,说:

错误-

File "C:\python3\WinPython\python-3.6.5.amd64\lib\site-packages\pandas\core\series.py", line 3275, in _sanitize_array
    raise Exception('Data must be 1-dimensional')

Exception: Data must be 1-dimensional

当我仅在一个位置(单个纬度/经度)提取值 (20075) 时,我可以这样做:

vname = 'clt'
#vname = 'surf_el'
var = nc.variables[vname]
hs = var[istart:istop,iy,ix]
tim = dtime[istart:istop]

# Create Pandas time series object
ts = pd.Series(hs,index=tim,name=vname)
#write to a CSV file
ts.to_csv('time_series_from_netcdf.csv')

我不知道我在哪里做错了?

【问题讨论】:

  • csv 格式是m 行的n 列,由逗号(或其他一些已知的分隔符)分隔。您希望如何以该格式保存 3d 数组?您是否尝试将数组重塑为(20075, 22*25)
  • 谢谢 hpaulj ,是的,我需要重塑它,然后我才能保存在 csv 或 text bcz 中,每个 lat-long 是一个网格。但是,如果您可以提供一些示例,以便我可以更好地理解它。谢谢

标签: python python-3.x python-2.7 numpy python-xarray


【解决方案1】:

我已经解决了这个问题。 解决方法在这里:

# suppose a 3D_array which contains (time series,latitude,longitude)
#for example: 3D_array.shape(1000,20,22)
#reshape your 3D array to 2D array for saving into csv or txt file

2Darray=np.resize(3D_array,[3D_array.shape[0],3D_array.shape[1]*3D_array.shape[2]])
np.savetxt("example.csv",2Darray,delimiter=',')

它将您的 3D 数组转换为 2D 数组,然后保存为 CSV 文件。最后,您将获得行中的时间序列值,列将表示网格位置(基于纬度/经度)。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    相关资源
    最近更新 更多