Я пытаюсь обработать CSV-файл с данными о погоде.
Файл организован так, что первый столбец - это год, второй - месяц, третий - день месяца, четвертый - часы (от 00 до 23 в день), а пятый - часовая температура точки росы для каждого день года. Некоторые дни имеют значения температуры для каждого часа, а некоторые имеют несколько часов, которые -999 или отсутствуют.
Я пытаюсь извлечь минимальные и максимальные дневные значения из этих почасовых данных. Для этого у меня есть утверждение «если», отсортированное по месяцам, чтобы определить количество дней в месяце. Затем в операторе if я сортирую по дате, чтобы извлечь минимальную точку росы (minDP) и максимальную точку росы (maxDP) из часовых данных. Чтобы найти minDP и maxDP, у меня есть отдельные функции min и max с одинаковыми параметрами аргумента: для каждой даты с ежечасными данными возвращайте min или max, если точки росы больше -999, в противном случае возвращайте «M» для « отсутствует "если все почасовые данные за день -999. Секция minDP работает нормально, однако maxDP всегда возвращает пропущенные для всех дат, и я не понимаю, почему. В разделе maxDP, если я изменю функцию «max» на «min», она успешно возвращает min.
for m in months:
if m == '01' or m =='03' or m == '05' or m == '07' or m == '08' or m == '10' or m == '12':
dates = ['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
for d in dates:
# For each date extract the minimum dewpoint, print "M" if all values for the date are less than -999
with open('samplehourlydata.txt', 'r') as f:
reader = csv.reader(f)
next(reader) # Skip header
MinDP = min(row[4] if row[1] == m and row[2] == d and int(row[4]) > -999 else 'M' for row in reader)
# For each date extract the maximum dewpoint, print "M" if all values for the date are less than -999
with open('samplehourlydata.txt', 'r') as f:
reader = csv.reader(f)
next(reader) # Skip header
MaxDP = max(row[4] if row[1] == m and row[2] == d and int(row[4]) > -999 else 'M' for row in reader)
print(year, m, d, MinDP, MaxDP)
Тот факт, что аргумент max выполняет часть «else» моего оператора if, заставляет меня думать, что он делает то, что я технически ему говорю. Тем не менее, я думаю, что я не должен говорить ему делать то, что я думаю. Однако тот факт, что простое изменение «max» на «min» в секции maxDP возвращает фактические значения min, кажется, подтверждает, что аргумент действителен ...
, если это помогает, данные CSV только для первого день выглядит так:
yyyy,mm,dd,hour,D.P.
2011,01,01,00, 27
2011,01,01,01, 28
2011,01,01,02, 27
2011,01,01,03, 26
2011,01,01,04, 26
2011,01,01,05, -999
2011,01,01,06, 28
2011,01,01,07, 27
2011,01,01,08, 28
2011,01,01,09, 29
2011,01,01,10, 31
2011,01,01,11, 34
2011,01,01,12, 37
2011,01,01,13, 39
2011,01,01,14, 40
2011,01,01,15, 42
2011,01,01,16, 44
2011,01,01,17, 43
2011,01,01,18, 43
2011,01,01,19, 43
2011,01,01,20, 43
2011,01,01,21, 42
2011,01,01,22, 44
2011,01,01,23, 44
и токовый выход с ошибочным maxDP выглядит так:
yyyy mm dd MinDP MaxDP
2011 01 01 26 M
Спасибо за любой ввод.