Python代码:“Min”格式正确,但“Max”

2024-06-17 18:09:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试处理一个包含天气数据的csv文件

文件的组织方式是,第一列是年份,第二列是月份,第三列是月份的第几天,第四列是小时数(每天00到23),第五列是一年中每天每小时的露点温度。有些日子的温度值为每小时,有些日子的温度值为-999或缺少几个小时

我试图从每小时的数据中提取每天的最小值和最大值。为此,我有一个按月份排序的“if”语句来标识每月的天数。然后在if语句中,我按日期排序,从每小时数据中提取最小露点(minDP)和最大露点(maxDP)。要查找minDP和maxDP,我有单独的min&;具有相同参数的max函数:对于具有每小时数据的每个日期,如果露点大于-999,则返回最小值或最大值;否则,如果该天的所有每小时数据均为-999,则返回“M”表示“缺失”。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”返回实际的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

谢谢你的意见


Tags: orcsvthe数据infordateif
2条回答

试一试

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

“\0”是最低的字符

这里有一个可能的解决方案(不验证年、月、日),但使用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]))只是说如果第一次看到该键,请将默认值设置为列表[],然后追加行[4]。如果已经看到该键,它只会追加第[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用于词典

相关问题 更多 >