3

大约两个小时前,我问了一个关于从网站读取和写入数据的问题。从那以后,我花了最后两个小时试图找到一种方法来从输出的“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”和其他排序/查找最大值的方法,甚至使用 pandas 和 numpy 库。这些似乎都不起作用。有人能指出我从 .csv 文件中找到最大列的正确方法吗?谢谢!

4

3 回答 3

2

如果你在 pandas DataFrame 中有它,你可以得到任何列的最大值,如下所示:

>>> max(data['time'])
'2012-01-18 15:52:26'

其中data是 DataFrame 的变量名称,time是列的名称

于 2013-05-10T01:44:21.583 回答
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()消耗 iterable,我们得到最大值。

  • max()可以使用key=指定“关键功能”的参数。它将使用 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))
  • 我不知道你想要哪一列...列“A”可能是第 0 列,所以我在上面使用了 0。根据需要替换列号。
于 2013-05-10T02:59:03.203 回答
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:]”的原因。

于 2013-05-10T02:17:50.277 回答