Python: Почему оператор else не принимает строку? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь рассчитать среднесуточную скорость ветра из файла с почасовой скоростью ветра. Для этого я использую циклы for, чтобы определить комбинации месяца и дня, а затем проанализировать почасовые данные о ветре за каждый календарный день. Почасовые данные либо имеют положительное значение, либо -999, если данные отсутствуют. Я написал следующую строку кода, которая успешно отфильтровывает все пропущенные данные в течение 24 часов и возвращает среднее значение за день:

Average_WindSpeed = sum(row[1] == m and row [2] == d and float(row[4]) if float(row[4]) > -999 else 0 for row in reader)/24

Моя проблема заключается в том, что условие else кода позволяет только мне ввести номер. Если я введу что-то вроде else: 'Missing', я получу TypeError: неподдерживаемые типы операндов для сообщений +: 'int' и 'str' . Я знаю, что TypeError означает, что есть некоторая комбинация чисел и строк, которые несовместимы, я просто не понимаю, как это происходит в операторе else. Я пытаюсь настроить оператор if таким образом, чтобы, если все 24 часа в сутки были -999, в противном случае будет возвращено значение «Отсутствует». Код работает с заполнителем else: 0, который я вставил, однако числовое значение, которое я должен передать, является ошибочным. Это соответствующий раздел кода в рамках более крупного проекта:

import csv

print("Month", "Day", "WindSpeed")
months = ['01']

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:

             # Calculate average daily windspeed from hourly data
             with open('samplehourlydata.txt', 'r') as f:
                reader = csv.reader(f)
                next(reader)
                Average_WindSpeed = sum(row[1] == m and row [2] == d and float(row[4]) if float(row[4]) > -999 else 0 for row in reader)/2
                print(Average_WindSpeed)

Если это поможет, вот несколько примеров данных:

yyyy,mm,dd,hour,W Speed
1941,01,01,00,-999
1941,01,01,01,-999
1941,01,01,02,-999
1941,01,01,03,-999
1941,01,01,04,-999
1941,01,01,05,-999
1941,01,01,06,-999
1941,01,01,07,-999
1941,01,01,08,-999
1941,01,01,09,-999
1941,01,01,10,-999
1941,01,01,11,-999
1941,01,01,12,-999
1941,01,01,13,-999
1941,01,01,14,-999
1941,01,01,15,-999
1941,01,01,16,-999
1941,01,01,17,-999
1941,01,01,18,-999
1941,01,01,19,-999
1941,01,01,20,-999
1941,01,01,21,-999
1941,01,01,22,-999
1941,01,01,23,-999
1941,01,02,00, 9.2
1941,01,02,01,11.5
1941,01,02,02, 9.2
1941,01,02,03,11.5
1941,01,02,04,11.5
1941,01,02,05, 8.1
1941,01,02,06, 9.2
1941,01,02,07,11.5
1941,01,02,08, 9.2
1941,01,02,09,10.4
1941,01,02,10,12.7
1941,01,02,11,13.8
1941,01,02,12,11.5
1941,01,02,13,10.4
1941,01,02,14,11.5
1941,01,02,15,11.5
1941,01,02,16,10.4
1941,01,02,17, 6.9
1941,01,02,18, 5.8
1941,01,02,19, 9.2
1941,01,02,20,10.4
1941,01,02,21,11.5
1941,01,02,22, 4.6
1941,01,02,23, 9.2

Кроме того, я знаю, что есть и другие способы сделать это может быть, например, установка словаря или использование numpy, однако я действительно пытаюсь понять эту «другую» ситуацию. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...