我有一项任务,我提供了一组数据如下
Station1.txt示例#different数据集为不同的no。站
Date Temperature
19600101 46.1
19600102 46.7
19600103 99999.9 #99999 = not recorded
19600104 43.3
19600105 38.3
19600106 40.0
19600107 42.8
我正在尝试创建一个函数
display_maxs(stations, dates, data, start_date, end_date)
显示
给定站点和给定日期的最高温度表
范围。例如:
stations = load_stations('stations2.txt')
5
data = load_all_stations_data(stations)
dates = load_dates(stations)
display_maxs(stations, dates, data, '20021224','20021228' #these are date yyyy/mm/dd)
我已经创建了数据函数
def load_all_stations_data(stations):
data = {}
file_list = ("Brisbane.txt", "Rockhampton.txt", "Cairns.txt", "Melbourne.txt", "Birdsville.txt", "Charleville.txt") )
for file_name in file_list:
file = open(stations(), 'r')
station = file_name.split()[0]
data[station] = []
for line in file:
values = line.strip().strip(' ')
if len(values) == 2:
data[station] = values[1]
file.close()
return data
电台的功能
def load_all_stations_data(stations):
stations = []
f = open(stations[0] + '.txt', 'r')
stations = []
for line in f:
x = (line.split()[1])
x = x.strip()
temp.append(x)
f.close()
return stations
和日期函数
def load_dates(stations):
f = open(stations[0] + '.txt', 'r')
dates = []
for line in f:
dates.append(line.split()[0])
f.close()
return dates
现在我只需要帮助创建表格,该表格显示任何给定日期限制的最大温度,并使用数据,日期和电台调用上述函数。
答案 0 :(得分:0)
不确定这些功能应该做什么,特别是因为其中两个似乎具有相同的名称。您的代码中也存在许多错误。
file = open(stations(), 'r')
在这里,您尝试将stations
称为函数,但它似乎是一个列表。station = file_name.split()[0]
文件名没有空格,所以这没有效果。你的意思是split('.')
?values = line.strip().strip(' ')
可能其中一个strip
应为split
?data[station] = values[1]
会在每次迭代中覆盖data[station]
。您可能想要append
值?temp.append(x)
未定义变量temp
;你的意思是stations
?此外,我建议你创建一个元组列表,而不是将日期和值读入两个单独的列表。这样您只需要一个功能:
def get_data(filename):
with open(filename) as f:
data = []
for line in f:
try:
date, value = line.split()
data.append((int(date), float(value)))
except:
pass # pass on header, empty lines ,etc.
return data
如果这不是一个选项,您可以通过压缩日期和值列表(即data = zip(dates, values)
)来创建元组列表。然后,您可以使用max
内置函数以及列表推导或生成器表达式来过滤日期之间的值,并使用特殊的key
函数按值进行排序。
def display_maxs(data, start_date, end_date):
return max(((d, v) for (d, v) in data
if start_date <= d <= end_date and v < 99999),
key=lambda x: x[1])
print display_maxs(get_data("Station1.txt"), 19600103, 19600106)
答案 1 :(得分:0)
使用pandas
。读取每个文本文件只是一个功能,具有注释处理,缺少数据(99999.9)处理和日期处理。以下代码将读取文件名fnames
序列中的文件,处理注释并将9999.9
转换为&#34;丢失&#34;值。然后它将获得从start
到stop
的日期,以及站名称序列(文件名减去扩展名),然后得到每个的最大值(在maxdf
中)。 / p>
import pandas as pd
import os
def load_all_stations_data(stations):
"""Load the stations defined in the sequence of file names."""
sers = []
for fname in stations:
ser = pd.read_csv(fname, sep='\s+', header=0, index_col=0,
comment='#', engine='python', parse_dates=True,
squeeze=True, na_values=['99999.9'])
ser.name = os.path.splitext(fname)[0]
sers.append(ser)
return pd.concat(sers, axis=1)
def get_maxs(startdate, stopdate, stations):
"""Get the stations and date range given, then get the max for each"""
return df.loc[start:stop, sites].max(skipna=True)
第二个功能的用法如下:
maxdf = get_maxs(df, '20021224','20021228', ("Rockhampton", "Cairns"))
如果#99999 = not recorded
评论实际上不在您的文件中,您可以删除engine='python'
和comment='#'
参数:
def load_all_stations_data(stations):
"""Load the stations defined in the sequence of file names."""
sers = []
for fname in stations:
ser = pd.read_csv(fname, sep='\s+', header=0, index_col=0,
parse_dates=True, squeeze=True,
na_values=['99999.9'])
ser.name = os.path.splitext(fname)[0]
sers.append(ser)
return pd.concat(sers, axis=1)