【发布时间】:2020-08-04 20:26:57
【问题描述】:
我正在尝试处理包含天气数据的 csv 文件。
文件的组织方式是第一列是年份,第二列是月份,第三列是月份中的某天,第四列是小时(每天 00 到 23),第五列是每一天的每小时露点温度年。有些日子有每小时的温度值,有些日子有几个小时是 -999 或缺失。
我正在尝试从每小时数据中提取最小和最大每日值。为此,我有一个按月排序的“if”语句来确定每月的天数。然后在 if 语句中,我按日期排序以从每小时数据中提取最小露点 (minDP) 和最大露点 (maxDP)。要找到 minDP 和 maxDP,我有具有相同参数参数的单独 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 参数正在执行我的 if 语句的“else”部分这一事实让我认为它正在做我在技术上告诉它做的事情。但是,我认为我不能告诉它做我认为的事情。然而,简单地将 maxDP 部分中的“max”更改为“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
感谢您的任何意见。
【问题讨论】:
-
阅读this article 了解调试代码的技巧。
-
我没有仔细看,但似乎您可能会使用字典顺序的最小/最大字符串(例如,“123”在“99”之前)。尝试转换为数字? (不过,您将无法将数字与“M”进行比较。)
标签: python python-3.x max min weather