【问题标题】:Python code: "Min" formatting correctly, but "Max"Python 代码:“Min”格式正确,但“Max”
【发布时间】: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


【解决方案1】:

试试

MaxDP = max(row[4] if row[1] == m and row[2] == d and int(row[4]) > -999 else '\0' for row in reader)

'\0' 是最低的字符

【讨论】:

  • 谢谢。我不熟悉那种最低级的性格方法
【解决方案2】:

这是一个可能的解决方案(不验证年、月、日),但使用 YYY MM DD 作为字典的键。这些值保存在该年、月和日的列表中。

这种方法不会为每个月的每一天重新打开文件,而是按年、月、日对它们进行汇总。

import csv

d = dict()

with open('f0.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader) # drop header
    for row in reader:
        key = ' '.join(row[:3]) # YYYY MM DD
        d.setdefault(key, []).append(int(row[4]))

print ('yyyy mm dd MinDP MaxDP')

for key, vals in d.items():
    if all(v == -999 for v in vals):
        print(key, 'M', 'M')
    else:
        my_max = max(vals)
        my_min = min([v for v in vals if v != -999])
        print(key, my_min, my_max)

对于你的数据,我得到了结果:

yyyy mm dd MinDP MaxDP
2011 01 01 26 44

更新:代码d.setdefault(key, []).append(int(row[4])) 只是表示如果第一次看到该键,请将 default 值设置为列表[],然后附加行[4]。如果密钥已经被看到,它只是追加 row[4]。

有一个简单的字典介绍here和循环遍历它们here

另外,这里有一个关于字典的链接geeksforgeeks,您可以在那里通过搜索找到更多 Python 信息。

另请注意,当从字典中删除键及其值时,如果该键不在字典中,则会引发异常。因此,如果您不确定字典中是否存在某个键,最好先检查:

if some_key in some_dict:
    del some_dict[some_key]

只要键在字典中,您就可以从像 var = dict_name[some_key] 这样的字典中检索值。如果不是,您将抛出异常。

在这种情况下,如果不确定密钥是否存在,您可以使用get

希望这些链接能让您开始使用字典。在您使用它们之后,它们并不难,并且是 Python(和其他语言)中最有用的数据结构之一。

Search page 用于字典。

【讨论】:

  • 这有帮助。我对使用字典不是很熟悉,所以我必须阅读它们。谢谢。
  • @Ethan 嗨,我在我的回复(上图)中添加了更新,以解释 d.setdefault(key, []).append(int(row[4])) 的作用。它处理字典的更新。希望它能为您解决一些问题。
  • @Ethan 我在帖子底部的“更新”部分中添加了一些有关词典的链接,这些链接可能会有所帮助。
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 2011-06-05
  • 2017-09-05
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多