当前位置: 首页 > 知识库问答 >
问题:

将时间序列数据从csv转换为netCDF python

潘高洁
2023-03-14

此过程中的主要问题是下面的代码:

precip[:] = orig

产生以下错误:

ValueError: cannot reshape array of size 5732784 into shape (39811,144,144)

我有两个CSV文件,其中一个包含变量(降水量)的所有实际数据,每一列都是一个站点,它们的对应坐标在第二个单独的CSV文件中。我的示例数据在这里的谷歌驱动器中。

如果您想查看数据本身,但我的第一个 CSV 文件具有形状(39811、144),第二个 CSV 文件具有形状(171、10),但请注意;我仅将切片数据帧用作 (144, 2)。

这是代码:

stations = pd.read_csv(stn_precip)
stncoords = stations.iloc[:,[0,1]][:144]
orig = pd.read_csv(orig_precip, skiprows = 1, names = stations['Code'][:144])

lons = stncoords['X']
lats = stncoords['Y']

ncout = netCDF4.Dataset('Precip_1910-2018_homomod.nc', 'w')

ncout.createDimension('longitude',lons.shape[0])
ncout.createDimension('latitude',lats.shape[0])
ncout.createDimension('precip',orig.shape[1])
ncout.createDimension('time',orig.shape[0])

lons_out = lons.tolist()
lats_out = lats.tolist()
time_out = orig.index.tolist()

lats = ncout.createVariable('latitude',np.dtype('float32').char,('latitude',))
lons = ncout.createVariable('longitude',np.dtype('float32').char,('longitude',))
time = ncout.createVariable('time',np.dtype('float32').char,('time',))
precip = ncout.createVariable('precip',np.dtype('float32').char,('time', 'longitude','latitude'))

lats[:] = lats_out
lons[:] = lons_out
time[:] = time_out
precip[:] = orig
ncout.close()

我的代码主要基于这篇文章:转换-csv-to-netcdf,但不包括变量“时间”作为第三维,所以这就是我失败的地方。我认为我应该期望沉淀变量具有形式(39811,144,144)的形状,但错误表明并非如此。

不完全确定如何处理这个问题,任何输入都是值得赞赏的。

共有1个答案

宋嘉懿
2023-03-14

由于您有来自不同站点的数据,我建议您对netCDF文件使用dimension station,而不要将< code>lon和< code>lat分开。当然,你可以将每个站点的经度和纬度保存到单独的变量中。

以下是一个可能的解决方案,以您的代码为例:

#!/usr/bin/env ipython
import pandas as pd
import numpy as np
import netCDF4

stn_precip='Precip_1910-2018_stations.csv'
orig_precip='Precip_1910-2018_origvals.csv'
stations = pd.read_csv(stn_precip)
stncoords = stations.iloc[:,[0,1]][:144]
orig = pd.read_csv(orig_precip, skiprows = 1, names = stations['Code'][:144])

lons = stncoords['X']
lats = stncoords['Y']
nstations = np.size(lons)

ncout = netCDF4.Dataset('Precip_1910-2018_homomod.nc', 'w')

ncout.createDimension('station',nstations)
ncout.createDimension('time',orig.shape[0])

lons_out = lons.tolist()
lats_out = lats.tolist()
time_out = orig.index.tolist()

lats = ncout.createVariable('latitude',np.dtype('float32').char,('station',))
lons = ncout.createVariable('longitude',np.dtype('float32').char,('station',))
time = ncout.createVariable('time',np.dtype('float32').char,('time',))
precip = ncout.createVariable('precip',np.dtype('float32').char,('time', 'station'))

lats[:] = lats_out
lons[:] = lons_out
time[:] = time_out
precip[:] = orig
ncout.close()
 类似资料:
  • 我正在尝试根据条件从数据帧创建csv,例如如果特定列不为null,则需要将其添加到csv文件中。我的代码确实会根据条件转换文件,但最终会添加一个额外的空行。检查屏幕截图 这是我的代码: 如何从csv文件中删除最后一个空行。

  • 我正在尝试将时间序列对象转换为矩阵。 此代码生成错误如下: 但是 出生时间序列 <代码>数据。矩阵(birthstimeseries)。它生成一维数据。如何将此数据帧的行数和列数保留到矩阵中。 我想要这样的结果作为一个矩阵。

  • 问题内容: 如何将数组转换为CSV文件? 这是我的数组: 问题答案: 我正在使用以下功能;它是对fputscsv注释中的man条目之一的改编。而且您可能想要展平该数组;不知道如果您传递一个多维的行会发生什么。

  • 问题内容: 我对熊猫有些陌生。我有一个熊猫数据框,它是1行乘23列。 我想将其转换为系列吗?我想知道最pythonic的方法是什么? 我试过了,但是抱怨。它不够聪明,无法意识到它仍然是数学上的“向量”。 谢谢! 问题答案: 它不够聪明,无法意识到它仍然是数学上的“向量”。 可以说它足够聪明,可以识别尺寸差异。:-) 我认为您可以做的最简单的事情是使用位置选择该行,这将为您提供一个Series,其列

  • 我想使用R从每个位置(X和Y)的Netcdf数据集中提取时间序列数据并将其转换为csv文件。这是我第一次处理NetCDF数据。有人能告诉我使用R或Matlab的相关代码吗? 这是我的数据描述: IRI FD季节性预测降水问题:Tercile概率数据 独立变量(网格): Tercile Classes网格:/C(ids)无序[(低于正常)(正常)(高于正常)]:发布的网格月份预测 网格:/F(自19

  • 问题内容: 我想将从下面的脚本中获取的HTML表转换为CSV文件,但是出现如下类型错误: TypeError:序列项0:预期的字符串,找到标记 将其转换为CSV文件的最简单方法是什么?我尝试为: 但它写了“无” HTML是这样的: 问题答案: 这是csv lib的工作,将每一个td放入每一行并提取文本,它将处理每一行中缺少值的地方: 与您在页面上看到的表格完全匹配的表格: 如果您想使用字幕: 但是