【问题标题】:How to create Python function that sums values from 7 daily files into one weekly file?如何创建 Python 函数,将 7 个每日文件中的值汇总到一个每周文件中?
【发布时间】:2014-06-18 14:55:38
【问题描述】:

我有以空格分隔的文件,其中包含不同 LAT/LON 位置的台站的每日降水值。以日常文件为例,格式如下:

经纬度PRCP

22.0 110.4 1.2

23.0 121.0 0.0

23.0 122.0 0.1

第一个字段等于纬度,第二个字段等于经度,第三个字段等于每日总降水量。

我希望创建一个每周文件,使用相同的格式从该周的每个每日文件中编译总计...但我遇到了问题。对我来说这可能更棘手的是,每个每日文件可能没有所有位置,这意味着行数可能不同,我不能简单地将每个文件行中的 TOTAL PRCP 字段逐行添加到每周文件中,因为它可能不会一整天都匹配。

我目前的方法是打开每个文件,遍历每一行,并将每个字段设置为一个变量,然后与第二个每日文件的变量进行比较,如果 LAT 和 LON,则将两个降水值的总和写入一行字段匹配...然后每天与第二天执行此操作并编写一个“sum”文件。

   with open(sundayFile, "r") as sundayFile:
    with open(mondayFile, "r") as mondayFile:
        with open(addMex1, "a") as addFile:

            print "\n\nNow checking Sunday File: " + str(sundayFile) + " and Monday File: " + str(mondayFile) + "\n\n"

            for lineA in sundayFile:
                parsedLineA = lineA.split()
                LAT_A = parsedLineA[0]
                LON_A = parsedLineA[1]
                TOTAL_PRCP_A = parsedLineA[2]

                print "Line in Sunday File: " + LAT_A + "," + LON_A + "," + TOTAL_PRCP_A + "\n"

                for lineB in mondayFile:
                    parsedLineB = lineB.split()
                    LAT_B = parsedLineB[0]
                    LON_B = parsedLineB[1]
                    TOTAL_PRCP_B = parsedLineB[2]

                    print "Line in Monday File: " + LAT_B + "," + LON_B + "," + TOTAL_PRCP_B + "\n"


                    if LAT_A == LAT_B and LON_A == LON_B:
                        print "\n***** Found a match for station at longitude of " + LON_A + " and latitude of " + LAT_A + "\n"
                        LAT = LAT_A
                        LON = LON_A
                        TOTAL_PRCP = str(float(TOTAL_PRCP_A) + float(TOTAL_PRCP_B))

                        addFile.write(LAT + "," + LON + "," + TOTAL_PRCP + "\n")


                    else:
                        addFile.write(LAT_A + "," + LON_A + "," + TOTAL_PRCP_A + "\n")
                        addFile.write(LAT_B + "," + LON_B + "," + TOTAL_PRCP_B + "\n")

这并没有真正起作用,我终于放弃了手动尝试……必须有一个 Pythonic,优雅的方式来执行此操作。非常感谢任何帮助!

【问题讨论】:

  • 您能否举例说明您的文件是什么样的。以及您希望输出的样子。
  • 建议...将文件导入数据帧到熊猫...一个库...他们有简单的读写方法...如果需要,您还可以合并帧对数据进行数学计算或执行枢轴和东西......
  • 文件大吗?你能记住一对夫妇吗?为什么不使用dict,其中键是lat,lon,值是累积的沉淀?
  • 谢谢大家的建议。文件不太大,可以放入内存中,如 BrianO 的所选答案所示。

标签: python file python-2.7 sum compare


【解决方案1】:

使用defaultdict 来保存降水的累积总和更简单。此 dict 的键将是有序的纬度和经度对。这就是诀窍:

from collections import defaultdict

files = ['sunday.txt', 'monday.txt', 'tuesday.txt', 'wednesday.txt', 
         'thursday.txt', 'friday.txt', 'saturday.txt'
]

totals = defaultdict(float)

for fn in files:
    with open(fn) as f:
        for line in f.readlines():
            lat, long, prec = line.split()  # strings
            totals[(lat, long)] += float(prec)

# See what we have:
import pprint
pprint.pprint(totals)

以下是一些示例数据:

monday.txt
----------
22.0 110.4 3.2
23.0 121.0 1.0
23.0 122.0 0.2
24.0 122.0 1.0

tuesday.txt
-----------
22.0 110.4 1.0

wednesday.txt
-------------
23.0 122.0 0.3

thursday.txt
------------
24.0 122.0 1.0
25.0 1.0 1.0

friday.txt
----------
24.0 122.0 1.1

saturday.txt
------------
23.0 121.0 10.5

这是上面代码的输出和这些文件:

{('22.0', '110.4'): 5.4,
 ('23.0', '121.0'): 11.5,
 ('23.0', '122.0'): 0.6000000000000001,
 ('24.0', '122.0'): 3.1,
 ('25.0', '1.0'): 1.0}

我没有采取额外的步骤将聚合数据写入相同格式的文件——我将把它留作练习;)

【讨论】:

  • 这很完美!非常感谢您的帮助。我不熟悉 defaultdict(或 pprint),但从现在开始会使用它!
猜你喜欢
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 2017-11-14
  • 1970-01-01
  • 2021-04-02
相关资源
最近更新 更多