вызывать данные строк из последовательных месяцев подряд и записывать их в столбцы? - PullRequest
0 голосов
/ 17 октября 2011

У меня есть таблицы климатических данных, для которых, по сути, мне нужно переместить части строк в столбцы и наоборот. К сожалению, формат несколько неловкий. Данные пришли ко мне со столбцами для года, месяца, количества дней в месяце, типа климатических данных в строке, а затем в 93 последовательных столбцах, каждый из которых представляет ежедневное значение, после чего следовал соответствующий флаг (так 3 условия, значение и 2 флага для каждого дня месяца). Хотя месяцы различаются по длине, более короткие месяцы заполнены нулевыми значениями в последних нескольких столбцах. Для обработки и моделирования мне нужен файл электронной таблицы / .csv со следующими столбцами:

год, месяц, день месяца (то есть число от 1 до 31), а затем пять столбцов, представляющих тип климатических данных (осадки, снег, снежная вода, tmax, tmin).

Если бы я мог также получить столбцы с соответствующими значениями флагов, это было бы здорово, но это не приоритет. Итак, я написал код ниже для распаковки строк в списки (возможно, очень неэффективно, но я новичок в этом), представляющих год, месяц, тип климатической переменной, значение переменной, flag1 и flag2 в зависимости от расположения в строке (соответствует дню от 1 до 31):

import matplotlib.mlab as mlab
from matplotlib.pyplot import figure, show
import numpy as np

import scipy
import csv

durham='C:\\Users\\LocalUser\\Desktop\\Drought Data\\My_Met_Data\\USHCN\\Durham.csv'

txt='met'
station='Durham'

output=station+"_"+txt+"_"+"new"+".csv"

infile=open(durham,'r')
outfile=open(output,'w')
writer=csv.writer(outfile)

yr=[]; mon=[]; var=[]; unit=[]; flag1=   [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\
flag2=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\
value=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31];\
valu=[]; flg1=[]; flg2=[]; prcp=[]; snow=[]; snwd=[]; tmax=[]; tmin=[]; row=[]
for line in infile:
  stationid, variable, units, year, month, days, flag1[0], value[0], flag2[0], flag1[1], value[1], flag2[1], flag1[2], value[2], flag2[2],\
  flag1[3], value[3], flag2[3], flag1[4], value[4], flag2[4], flag1[5], value[5], flag2[5], flag1[6], value[6], flag2[6],\
  flag1[7], value[7], flag2[7], flag1[8], value[8], flag2[8] ,flag1[9], value[9], flag2[9], flag1[10], value[10], flag2[10],\
  flag1[11], value[11], flag2[11], flag1[12], value[12], flag2[12], flag1[13], value[13], flag2[13], flag1[14], value[14], flag2[14],\
  flag1[15], value[15], flag2[15], flag1[16], value[16], flag2[16], flag1[17], value[17], flag2[17], flag1[18], value[18], flag2[18],\
  flag1[19], value[19], flag2[19], flag1[20], value[20], flag2[20], flag1[21], value[21], flag2[21], flag1[22], value[22], flag2[22],\
  flag1[23], value[23], flag2[23], flag1[24], value[24], flag2[24], flag1[25], value[25], flag2[25], flag1[26], value[26], flag2[26],\
  flag1[27], value[27], flag2[27], flag1[28], value[28], flag2[28], flag1[29], value[29], flag2[29], flag1[30], value[30], flag2[30]=line.split(',')
  yr=[int(year)]
  mon=[int(month)]
  var=variable
  unit=units

  for yr in range(1926, 2003):
     for mon in range(1,13):
        if var=='PRCP':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            prcp.append(valu[j])

        elif var=='SNOW':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            snow.append(valu[j])

        elif var=='SNWD':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            snwd.append(valu[j])

        elif var=='TMAX':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            tmax.append(valu[j])

        elif var=='TMIN':
          valu=[float(i) for i in value]
          flg1=[flag1]
          flg2=[flag2]
          for j in range(31):
            tmin.append(valu[j])

            row=[yr, mon, j+1, prcp[j], snow[j], snwd[j], tmax[j], tmin[j]]
            writer.writerow(row)


infile.close()
outfile.close()

Теперь, оставив в стороне, что я получаю ошибку памяти при запуске, если я уберу несколько климатических переменных, тогда я получу действительно успешно получить файл .csv в формате , который Я хочу. Проблема состоит в том, что каждый месяц, каждый год (1926-2002), сообщает одни и те же значения климатических данных, то есть данные за январь 1926 года. Код вызывает данные из соответствующей переменной для соответствующий день, но повторяя одни и те же данные месяц за месяцем. Я не уверен, где я ошибся, но любые предложения / помощь будут высоко оценены.

1 Ответ

1 голос
/ 17 октября 2011

Каждый for делает петлю;у вашего кода есть два цикла внутри года - он обрабатывает все годы с первой строкой файла, затем все годы для второй и т. д. Это ошибка, с которой вы сталкиваетесь,но если вы просто позаботитесь о том, чтобы как-то это исправить, скоро появится другой.


Теперь, пожалуйста, одолжите в библиотеке хорошую книгу по Python и потратьте некоторое время на чтение и выполнение упражнений.Или присоединиться к курсу.Найдите знающего друга, который рассмотрит ваш код для вас.StackOverflow может помочь вам решить конкретную проблему, но, к сожалению, он не может научить вас концепции.Вы на неправильном пути;нет ничего, кроме неприятностей, если вы просто продолжите в том же духе.Вы должны вернуться и изучить основы немного лучше, в долгосрочной перспективе это будет намного проще.

Компьютеры предназначены для того, чтобы выполнять утомительные и повторяющиеся задачи за вас.Вы не должны никогда печатать гигантский список чисел или пронумерованных переменных.Познакомьтесь со списками (и списками списков) и функцией range .

Используйте описательные имена для ваших переменных, а не сокращения.Это Python, нам нравится все ясно.И поместите каждое утверждение в свою строку;все эти точки с запятой выглядят безобразно.Эти вещи важны, если вы хотите поделиться кодом, получить помощь или просто организовать свои собственные мысли о нем.

Изучите документацию для csv module и используйте его читатель, а не толькописатель.

Познакомьтесь с нарезкой списка , в частности с разновидностью строки [1 :: 3].

Изучите оператор с для файлов.

Если вы делаете то же самое в каждом if / elif, переместите его оттуда в обычное место.

Вот вам однажды стать хорошим программистом:)

...