2015-03-19 4 views
2

У меня есть следующий код Python, который отлично работает для одного файла CSV для преобразования в файл netCDF.Прочитайте несколько файлов csv и напишите несколько файлов netCDF

Но, у меня есть несколько файлов (365), так как, 'TRMM_1998_01_02_newntcl.csv', 'TRMM_1998_01_03_newntcl.csv' .... ДО 'TRMM_1998_12_31_newntcl.csv.

Может кто-нибудь помочь мне написать цикл через все файлы csv и создать 365 netCDF-файлов, используя этот код.?

Anyhelp оценили.

Заранее спасибо.

import numpy as np 

def convert_file(filename): 
data = np.loadtxt(fname=filename, delimiter=',') 
# filename = "TRMM_{}_{}_{}_newntcl.csv".format(d.year,d.month,d.day) 
Lat_data = np.loadtxt('Latitude.csv', delimiter=',') 
Lon_data = np.loadtxt('Longitude.csv', delimiter=',') 

# create a netcdf Data object 

with netCDF4.Dataset('TEST_file.nc', mode="w", format='NETCDF4') as ds: 
    # some file-level meta-data attributes: 
    ds.Conventions = "CF-1.6" 
    ds.title = 'precipitation' 
    ds.institution = 'Institute' 
    ds.author = 'Author' 

    lat_arr = data[:,0] # the first column 
    lon_arr = data[:,1] # the second column 
    precip_arr = data[:,2] # the third column 

    nlat = lat_arr.reshape((161, 321)) 
    nlon = lon_arr.reshape((161, 321)) 

    # ds.createDimension('time', 0) 
    ds.createDimension('latitude', 161) 
    ds.createDimension('longitude', 321) 


    precip = ds.createVariable('precip', 'f4', ('latitude', 'longitude')) 
    precip[:] = data[:,2] 
    ## adds some attributes 
    precip.units = 'mm' 
    precip.long_name = 'Precipitation' 


    lat = ds.createVariable('lat', 'f4', ('latitude')) 
    lat[:] = Lat_data[:] 
    ## adds some attributes 
    lat.units = 'degrees_South' 
    lat.long_name = 'Latitude' 


    lon = ds.createVariable('lon', 'f4', ('longitude')) 
    lon[:] = Lon_data[:] 
    ## adds some attributes 
    lon.units = 'degrees_East' 
    lon.long_name = 'Longitude'  


    print ds 


# print filename 

# load the data 

path='C:\Users\.spyder2' 
os.chdir(path) 

d=datetime.date(1998,01,01) 
while d.year==1998: 
    d+=datetime.timedelta(days=1) 
    convert_file("TRMM_{}_{}_{}_newntcl.csv".format(d.year,d.month,d.day)) 

ответ

0

Похоже, что вы можете использовать datetime.date объект для перебора всех дней в году. Во-первых, вы должны поместить код, который у вас есть, в функцию, которая принимает имя файла. Затем, вы можете просто сделать date объект и вызвать функцию в цикле:

import datetime 
d=datetime.date(1998,1,1) 
while d.year==1998: 
    d+=datetime.timedelta(days=1) 
    convert_file("TRMM_{}_{}_{}_newntcl.csv".format(d.year,d.month,d.day)) 
+0

Прежде всего, я не знаю, как создать файл функции, используя мой код, вышеперечисленный. Я очень новичок в python. Тогда я не знаю, как использовать свой код выше, чтобы вызвать эту функцию, которую я создал. Можете ли вы показать мне пример? – user3408139

+0

@ user3408139 [Здесь] (https://docs.python.org/2/tutorial/controlflow.html#defining-functions) является базовым руководством по определению функций в Python. В моем коде я использовал функцию, предполагая, что она называется 'convert_file' и принимает имя файла для преобразования в качестве единственного аргумента. – KSFT

+0

OK. Мне нужно сохранить мой код выше как функцию под названием «convert_file», а затем запустить код выше? это то, что вы имели ввиду? – user3408139

0

Если я правильно прочитал ваш вопрос, есть более простой способ использования ОС в данном случае. Вы можете просто взять имена файлов и использовать их в цикле:

import os 

main_fp = "C:\\Users\\spyder2" 
path, dirs, files = os.walk(main_fp).next() 

for f_path in files: 

    data = np.loadtxt(f_path, delimiter=',') 
    Lat_data = np.loadtxt('Latitude.csv', delimiter=',') #put lat and long csv's in separate folder, so you don't read them into the loop 
    Lon_data = np.loadtxt('Longitude.csv', delimiter=',') 

    #strip csv extentions 
    new_fname = f_path.strip('.csv') 


    with netCDF4.Dataset(new_fname+'.nc', mode="w", format='NETCDF4') as ds: 
      # some file-level meta-data attributes: 
      ds.Conventions = "CF-1.6" 
      ds.title = 'Non TC precipitation' 
      ds.institution = 'AIR-Worldwide' 
      ds.author = 'Dr. Dumindu Jayasekera' 

     lat_arr = data[:,0] # the first column 
     lon_arr = data[:,1] # the second column 
     precip_arr = data[:,2] # the third column 

     nlat = lat_arr.reshape((161, 321)) 
     nlon = lon_arr.reshape((161, 321)) 

     ds.createDimension('latitude', 161) 
     ds.createDimension('longitude', 321) 

     precip = ds.createVariable('precip', 'f4', ('latitude', 'longitude')) 
     precip[:] = data[:,2] 
     ## adds some attributes 
     precip.units = 'mm' 
     precip.long_name = 'Precipitation' 

     lat = ds.createVariable('lat', 'f4', ('latitude')) 
     lat[:] = Lat_data[:] 
     ## adds some attributes 
     lat.units = 'degrees_South' 
     lat.long_name = 'Latitude' 

     lon = ds.createVariable('lon', 'f4', ('longitude')) 
     lon[:] = Lon_data[:] 
     ## adds some attributes 
     lon.units = 'degrees_East' 
     lon.long_name = 'Longitude' 

     print ds 
+0

Где я могу ввести имена файлов в приведенном выше коде? Мои имена файлов: TRMM_1998_01_01_newntcl.csv, TRMM_1998_01_02_newntcl.csv upto TRMM_1998_02_14_newntcl.csv в пути, указанном «C: \\ Users \\ spyder2». – user3408139

+0

Имена файлов берутся из файлов в папке. Пожалуйста, экспериментируйте с кодом; запустить первую часть и распечатать f_path, это ваши имена файлов. – ajsp

+0

Я провел первые 5 строк, и я получил эту ошибку ниже. Traceback (самый последний вызов последнего): Файл "", строка 8, в данных = np.loadtxt (путь, ограничителем = '') Файл «C: \ Пользователи \ I54814 \ AppData \ Local \ Continuum \ Anaconda \ lib \ site-packages \ numpy \ lib \ npyio.py ", строка 860, в loadtxt items = [conv (val) для (conv, val) в zip (конвертеры) , vals)] ValueError: не удалось преобразовать строку в float: rem *** Журнал истории терминалов Spyder *** – user3408139

Смежные вопросы