在给定限制的情况下查找数据集中的最大值

时间:2015-04-15 14:22:51

标签: python

我有一项任务,我提供了一组数据如下

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

现在我只需要帮助创建表格,该表格显示任何给定日期限制的最大温度,并使用数据,日期和电台调用上述函数。

2 个答案:

答案 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;值。然后它将获得从startstop的日期,以及站名称序列(文件名减去扩展名),然后得到每个的最大值(在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)