我遇到了以下问题:我想读取一个由年份和温度两列组成的数据文本文件,并能够计算每年的最低温度等。整个文件的开头是这样的:
1995.0012 -1.34231
1995.3030 -3.52533
1995.4030 -7.54334
等等,直到2013年。我有以下想法:
f=open('munich_temperatures_average.txt', 'r')
for line in f:
line = line.strip()
columns = line.split()
year = float(columns[0])
temperature=columns[1]
if year-1995<1 and year-1995>0:
print 1995, min(temperature)
有了这个,我只得到1995年的数据,这是我第一步想要的。在第二步中,我想计算1995年整个数据集的最低温度。然而,通过使用上面的脚本,我获得了数据文件中每一行的最低温度。我试着建立一个列表,然后添加温度,但如果我想把年份转换成整数或把温度转换成浮点等,我会遇到麻烦。
我觉得我错过了如何计算一列中一组值(而不是整列(的最小值的正确想法。
有什么想法我可以解决这个问题吗?我正在尝试学习Python,但仍处于初学者阶段,所以如果有一种方法可以在不使用"高级"命令的情况下完成整件事,我会欣喜若狂!
我可以使用regexp
import re
from collections import defaultdict
REGEX = re.compile(ur"(d{4}).d+ ([0-9-.+]+)")
f = open('munich_temperatures_average.txt', 'r')
data = defaultdict(list)
for line in f:
year, temperature = REGEX.findall(line)[0]
temperature = float(temperature)
data[year].append(temperature)
print min(data["1995"])
您可以使用csv
模块,这将使读取和操作文件的每一行变得非常容易:
import csv
with open('munich_temperatures_average.txt', 'r') as temperatures:
for row in csv.reader(temperatures, delimiter=' '):
print "year", row[0], "temp", row[1]
之后,只需要找到各行中的最小温度。看见csv模块文档
如果你只想要年份和时间:
years,temp =[],[]
with open("f.txt") as f:
for line in f:
spl = line.rstrip().split()
years.append(int(spl[0].split(".")[0]))
temp.append(float(spl[1]))
print years,temp
[1995, 1995, 1995] [-1.34231, -3.52533, -7.54334]
我之前提交过另一种方法,使用numpy
库,考虑到您是python的新手,这可能会让人感到困惑。抱歉。正如你自己所提到的,你需要有1995年的一些记录,但你不需要一个列表:
mintemp1995 = None
for line in f:
line = line.strip()
columns = line.split()
year = int(float(columns[0]))
temp = float(columns[1])
if year == 1995 and (mintemp1995 is None or temp < mintemp1995):
mintemp1995 = temp
print "1995:", mintemp1995
注意year
对int
的转换,这样您就可以直接将其与1995进行比较,以及之后的条件:
如果变量mintemp1995
以前从未设置过(是None
,因此是数据集的第一个条目(,或者当前温度低于该值,则它会替换它,因此您只有最低温度的记录。