首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python将netCDF转换为CSV

使用python将netCDF转换为CSV
EN

Stack Overflow用户
提问于 2019-05-01 22:23:30
回答 2查看 1.8K关注 0票数 0

我对Python很陌生,并试图以专栏格式将netCDF文件解析为.CSV,因此我可以将数据加载到关系数据库管理系统中,以用于其他报告目的。请参阅下面的详细资料。

我的netCDF文件的快照:

代码语言:javascript
复制
dimensions:
time = UNLIMITED ; // (36 currently)
grid_latitude = 548 ;
grid_longitude = 421 ;
time_0 = UNLIMITED ; // (3 currently)
pressure = 3 ;
time_1 = UNLIMITED ; // (3 currently)
bnds = 2 ;
pressure_0 = 2 ;
pressure_1 = 3 ;
dim0 = UNLIMITED ; // (3 currently)
grid_longitude_0 = 421 ;
grid_latitude_0 = 547 ;
time_3 = UNLIMITED ; // (3 currently)
variables:
float stratiform_snowfall_rate(time, grid_latitude, grid_longitude) ;
stratiform_snowfall_rate:_FillValue = -1.073742e+09f ;
string stratiform_snowfall_rate:long_name = "stratiform_snowfall_rate" ;
string stratiform_snowfall_rate:units = "kg m-2 s-1" ;
string stratiform_snowfall_rate:um_stash_source = "m01s04i204" ;
string stratiform_snowfall_rate:grid_mapping = "rotated_latitude_longitude" ;string stratiform_snowfall_rate:coordinates = "forecast_period forecast_reference_time" ;int rotated_latitude_longitude ;

我的守则:

代码语言:javascript
复制
from netCDF4 import Dataset, num2date
filename ='prods_op_mogreps-uk_20140717_03_11_015.nc'
nc = Dataset(filename, 'r', Format='NETCDF4')
 ncv = nc.variables
 lats = nc.variables['grid_latitude'][:]
 lons = nc.variables['grid_longitude'][:]
 sfc= nc.variables['stratiform_snowfall_rate'][:]
 times = nc.variables['time'][:]
 units = nc.variables['time'].units
 dates = num2date (times[:], units=units, calendar='365_day')
 header = ['Latitude', 'Longitude']
 for d in dates:
    header.append(d)
import csv
with open('output.csv', 'wb') as csvFile:
    outputwriter = csv.writer(csvFile, delimiter=',')
    for time_index, time in enumerate(times): # pull the dates out for the header
         t = num2date(time, units = units, calendar='365_day')
         header.append(t)
    outputwriter.writerow(header)  
    for lat_index, lat in enumerate(lats):
        content = lat
        #print lat_index
        for lon_index, lon in enumerate(lons):
            content.append(lon)
            #print lon_index    
            for time_index, time in enumerate(times): # for a date
                # pull out the data 
                data = sfc[time_index,lat_index,lon_index]
                content.append(data)
                outputwriter.writerow(content)
csvFile.close()
nc.close()

我正在犯以下错误:

TypeError跟踪(最近一次调用),以4t=num2date(时间,单位=单位,日历=‘365_day’)5 header.append(t) -6 outputwriter.writerow(头)7表示lat_index,lat in枚举(Lats):8 content = lat TypeError:需要一个类似字节的对象,而不是'str‘’。

请帮我处理这段代码。谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-05-02 06:36:38

选择'wb'以二进制模式打开输出文件。

因此,文件写入函数需要二进制数据,即bytes对象。

但是,当您请求帮助编写csv-文件时,我假设您想要编写纯文本数据,所以只需在这里删除二进制文件的b

代码语言:javascript
复制
with open('output.csv', 'w') as csvFile:
票数 1
EN

Stack Overflow用户

发布于 2020-06-12 15:40:28

最简单的方法是使用xarray和大熊猫。

代码语言:javascript
复制
import xarray as xr
import pandas as pd

您首先需要使用xarray读取数据:

代码语言:javascript
复制
data = xr.open_dataset(filename)

然后需要将其转换为熊猫数据集,并重新设置索引:

代码语言:javascript
复制
data_df = data.to_dataframe().reset_index()

最后,您需要将其保存为csv:

代码语言:javascript
复制
data_df.to_csv(outfile)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55943456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档