我在两个小时前提出了一个关于从网站上读取和写入数据的问题。我花了最后两个小时从那时起试图找到一种方法来读取输出列'A'的最大日期值,将该值与刷新的网站数据进行比较,并将任何新数据附加到csv文件而不覆盖旧的或创建副本。
目前100%正常工作的代码是:
import requests
symbol = "mtgoxUSD"
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol)
data = requests.get(url)
with open("trades_{}.csv".format(symbol), "r+") as f:
f.write(data.text)
我尝试了各种方法来查找列'A'的最大值。我已经尝试了一些使用“Dict”和其他排序/查找max的方法,甚至使用pandas和numpy libs的不同方法。这似乎都不起作用。有人能指出我从.csv文件中找到列的最大值的方向吗?谢谢!
答案 0 :(得分:2)
如果你在pandas DataFrame中有它,你可以得到这样的任何列的最大值:
>>> max(data['time'])
'2012-01-18 15:52:26'
其中data
是DataFrame的变量名称,time
是列的名称
答案 1 :(得分:1)
似乎这样的事情应该有效:
import requests
import csv
symbol = "mtgoxUSD"
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol)
data = requests.get(url)
with open("trades_{}.csv".format(symbol), "r+") as f:
all_values = list(csv.reader(f))
max_value = max([int(row[2]) for row in all_values[1:]])
(write-out-the-value?)
编辑:我使用了“row [2]”因为那是我在csv中占用最多的样本列。另外,我不得不去除列标题,这些都是文本,这就是我从第二行到文件末尾查看“all_values [1:]”的原因。
答案 2 :(得分:1)
我会给你两个答案,一个只返回最大值,另一个返回CSV中包含最大值的行。
import csv
import operator as op
import requests
symbol = "mtgoxUSD"
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol)
csv_file = "trades_{}.csv".format(symbol)
data = requests.get(url)
with open(csv_file, "w") as f:
f.write(data.text)
with open(csv_file) as f:
next(f) # discard first row from file -- see notes
max_value = max(row[0] for row in csv.reader(f))
with open(csv_file) as f:
next(f) # discard first row from file -- see notes
max_row = max(csv.reader(f), key=op.itemgetter(0))
注意:
max()
可以直接使用迭代器,csv.reader()
给我们一个迭代器,所以我们可以传入它。我假设你可能需要扔掉一个标题行所以我展示了如何做到这一点。如果您要丢弃多个标题行,则可能需要使用islice()
模块中的itertools
。
在第一个中,我们使用“生成器表达式”从每一行中选择一个值,并找到最大值。这非常类似于“列表理解”,但它不构建整个列表,它只是让我们迭代结果值。然后max()
使用迭代,我们得到最大值。
max()
可以使用key=
参数指定“关键功能”。它将使用键函数获取值并使用该值来计算最大值...但max()
返回的值将是未修改的原始值(在这种情况下,是CSV中的行值)。在这种情况下,关键功能是由operator.itemgetter()
为您制作的......您传递了所需的列,operator.itemgetter()
为您构建了一个获取该列的函数。
结果函数相当于:
def get_col_0(row):
return row[0]
max_row = max(csv.reader(f), key=get_col_0)
或者,人们会使用lambda
:
max_row = max(csv.reader(f), key=lambda row: row[0])
但我觉得operator.itemgetter()
方便又好看。它很快。
也许是这样的:
text = data.text
rows = [line.split(',') for line in text.split("\n") if line]
rows.pop(0) # get rid of first row from data
max_value = max(row[0] for row in rows)
max_row = max(rows, key=op.itemgetter(0))