Dataframe 无法将NetCDF文件导入数据帧

Dataframe 无法将NetCDF文件导入数据帧,dataframe,pandas,netcdf,Dataframe,Pandas,Netcdf,我作为一个初学者已经做了一段时间了。总的来说,我希望读入一个NetCDF文件,并将多个(~50)列(和17520个案例)导入到一个数据帧中。目前,我已经为一个包含4个变量的列表设置了它,但我希望能够以某种方式扩展它。我做了一个开始,但是任何关于如何循环使用50个变量来实现这一点的帮助都是非常好的。对于4个变量,它确实可以使用下面的代码。我知道这不太好——还在学习 另一个问题是,当我试图将numpy数组直接读入Pandas数据帧时,它不起作用,而是创建了一个17520列大的数据帧。它应该是另一种方

我作为一个初学者已经做了一段时间了。总的来说,我希望读入一个NetCDF文件,并将多个(~50)列(和17520个案例)导入到一个数据帧中。目前,我已经为一个包含4个变量的列表设置了它,但我希望能够以某种方式扩展它。我做了一个开始,但是任何关于如何循环使用50个变量来实现这一点的帮助都是非常好的。对于4个变量,它确实可以使用下面的代码。我知道这不太好——还在学习

另一个问题是,当我试图将
numpy
数组直接读入Pandas数据帧时,它不起作用,而是创建了一个17520列大的数据帧。它应该是另一种方式(转置)。如果我创建了一个系列,它工作得很好。所以我不得不用以下几行来绕开这个话题。甚至不知道它为什么会起作用。有没有更好的方法的建议(特别是当涉及到50个变量时)

整个代码粘贴如下:

import pandas as pd
import datetime as dt
import xlrd
import numpy as np
import netCDF4


def excel_to_pydate(exceldate):
    datemode=0           # datemode: 0 for 1900-based, 1 for 1904-based
    pyear, pmonth, pday, phour, pminute, psecond = xlrd.xldate_as_tuple(exceldate, datemode)
    py_date = dt.datetime(pyear, pmonth, pday, phour, pminute, psecond)
    return(py_date)

def main():
    filename='HowardSprings_2010_L4.nc'
#Define a list of variables names we want from the netcdf file
    vnames = ['xlDateTime', 'Fa', 'Fh' ,'Fg']

# Open the NetCDF file
    nc = netCDF4.Dataset(filename) 

#Create some lists of size equal to length of vnames list.
    temp=list(xrange(len(vnames)))
    vartemp=list(xrange(len(vnames)))

#Enumerate the list and assign each NetCDF variable to an element in the lists.  
# First get the netcdf variable object assign to temp
# Then strip the data  from that and add to temporary variable (vartemp)
    for index, variable in enumerate(vnames):               
        temp[index]= nc.variables[variable]
        vartemp[index] = temp[index][:]   

# Now call the function to convert to datetime from excel. Assume datemode: 0
    times = [excel_to_pydate(elem) for elem in vartemp[0]]

#Dont know why I cant just pass a list of variables i.e. [vartemp[0], vartemp[1], vartemp[2]]
#But this is only thing that worked
#Create Pandas dataframe using times as index
    d={vnames[0] :vartemp[0], vnames[1] :vartemp[1], vnames[2] :vartemp[2], vnames[3] :vartemp[3]}
    theDataFrame = pd.DataFrame(d,index=times)

#Define missing data value and apply to DataFrame
    missing=-9999
    theDataFrame1=theDataFrame.replace({vnames[0] :missing, vnames[1] :missing, vnames[2] :missing, vnames[3] :missing},'NaN')

main()
您可以替换:

d = {vnames[0] :vartemp[0], ..., vnames[3]: vartemp[3]}
hs = pd.DataFrame(d, index=times)

也就是说,熊猫可以直接阅读,因此netCDF(基于HDF5)可能也是如此。

您可以替换:

d = {vnames[0] :vartemp[0], ..., vnames[3]: vartemp[3]}
hs = pd.DataFrame(d, index=times)


也就是说,熊猫可以直接阅读,所以netCDF(基于HDF5)可能也是如此。

我相信你可以通过orient='index'来获得你想要的建筑行为,请参见“谢谢”。我仍然有问题。熊猫似乎一直希望将列表“vnames[]”作为行而不是列导入。所以,当我按照您的建议做时,它给出了一个断言错误:传递的项目数量错误(4对17520)。如果我尝试pd.DataFrame(vartemp[0:4]),它将返回Int64Index:4个条目,0到3列:17520个条目,0到17519。我要去crazy@user1911866您能提供一个小的示例文件来演示这一点吗?再次感谢您积极参与本论坛!我想可能还有别的问题。我刚刚发布了另一个问题(这也可能解决这个问题)。称为“OnError:必须是混合类型数据帧”。如果您有任何想法,我将不胜感激:)我相信您可以通过orient='index'来获得所需的施工行为,请参阅“谢谢”。我仍然有问题。熊猫似乎一直希望将列表“vnames[]”作为行而不是列导入。所以,当我按照您的建议做时,它给出了一个断言错误:传递的项目数量错误(4对17520)。如果我尝试pd.DataFrame(vartemp[0:4]),它将返回Int64Index:4个条目,0到3列:17520个条目,0到17519。我要去crazy@user1911866您能提供一个小的示例文件来演示这一点吗?再次感谢您积极参与本论坛!我想可能还有别的问题。我刚刚发布了另一个问题(这也可能解决这个问题)。称为“OnError:必须是混合类型数据帧”。如果你有什么想法,我会很感激:)为什么不直接拿?为什么不直接拿??
hs = pd.DataFrame(vartemp[0:4], columns=vnames[0:4], index=times)