【问题标题】:prepend a header to .csv file with python使用 python 在 .csv 文件中添加标头
【发布时间】:2016-01-01 12:31:59
【问题描述】:

我当前的代码能够从 Google Finance 获取历史数据,但缺少第一行来标记每一列。 我想要如下的输出

库存、日期、时间、开盘价、最高价、最低价、收盘价、成交量 CCK,2015-12-30,00:00:00,1.05,1.05,0.99,1.00,157800 CCK,2015-12-31,00:00:00,0.98,1.03,0.98,1.02,55300

 stocklist=['CCK','MSFT','AA','AAPL']
        stocklen=len(stocklist)

for x in range(1,stocklen,1):
    q = GoogleQuote(stocklist[x],'2015-12-21')
    header = ['Stock','Date','Time','Open','High','Low','Close']
    print header                                             
    print q                                                   
    q.write_csv(stocklist[x]+".csv")
    with open(stocklist[x]+".csv",'a') as f:
        w = csv.writer(f)
        w.writerow(['Stock','Date','Time','Open','High','Low','Close'])

但是,输出在最后一行

CCK,2015-12-30,00:00:00,1.05,1.05,0.99,1.00,157800 CCK,2015-12-31,00:00:00,0.98,1.03,0.98,1.02,55300 股票,日期,时间,开盘,高,低,收盘,成交量

【问题讨论】:

  • 您正在追加,所以它在最后是有意义的,如果您想预先添加,您将不得不覆盖存储所有内容的文件并预先添加或写入临时文件
  • 我需要使用第一行的标签进行数据分析。由于我有很多 .csv 文件,如何在第一行添加标签?
  • @bkcollection Padraic 可能想说,因为你是附加到一个文件(你用a 打开它),但想把标题放在顶部,你可能想使用临时文件转储附件。但是如果你只需要写入 csv 文件,你可以这样做: with open(stocklist[x]+".csv",'w') as f: w = csv.DictWriter(f, fieldnames=header) w.writerow (...)
  • @bkcollection,类似于stackoverflow.com/questions/31888222/…,在wr = csv.writer(... 之后,您将编写标题,然后对其余数据执行任何操作

标签: python csv finance google-finance


【解决方案1】:

GoogleQuote 来自哪里?是来自quotes.py吗???

如果是这样,那么您的代码将已经生成带有标题行的 CSV 文件,唯一的区别是第一列标记为 Symbol 而不是 Stock。如果您反对该标签,您可以像这样更改它:

import csv
import datetime
from itertools import repeat

header = ['Stock', 'Date', 'Time', 'Open', 'High', 'Low', 'Close', 'Volume']
stocklist=['CCK','MSFT','AA','AAPL']
start = datetime.datetime(2015, 12, 21)
#end = datetime.datetime(2015, 12, 31)
for stock in stocklist:
    q = GoogleQuote(stock, start.strftime('%F'))
    data = zip(repeat(q.symbol), q.date, q.time, q.open_, q.high, q.low, q.close, q.volume)
    with open('{}.csv'.format(stock), 'w') as f:
        w = csv.writer(f)
        w.writerow(header)
        w.writerows(data)

你可以使用pandas:

import datetime
import pandas.io.data as web

stocklist=['CCK','MSFT','AA','AAPL']
start = datetime.datetime(2015, 12, 21)
end = datetime.datetime(2015, 12, 31)
for stock in stocklist:
    data = web.DataReader(stock, 'google', start, end)
    data.to_csv('{}.csv'.format(stock))

这将为每只股票在包含日期的范围内创建单独的 CSV 文件,并带有标题行:

日期、开盘价、最高价、最低价、收盘价、成交量

pandas 和你的代码在输出上的区别是:

  • 库存不作为 CSV 的第一列显示。由于每个文件都被命名 根据库存,文件本身不需要它。
  • 时间列不存在。报价是针对日期的,因此时间可能不相关。

如果您确实必须有股票和时间列,可以将它们添加到数据框中。

for stock in stocklist:
    data = web.DataReader(stock, 'google', start, end)
    data.insert(0, 'Time', [ts.time() for ts in data.index])
    data.reset_index(inplace=True)    # make Date a proper column
    data.insert(0, 'Stock', stock)
    data.to_csv('{}.csv'.format(stock), index=False)

请注意,日期列是时间戳,因此可能不需要添加时间列。相反,您可以省略添加时间列并使用以下格式设置日期:

    data.to_csv('{}.csv'.format(stock), index=False, date_format='%F %T')

【讨论】:

  • 我希望我可以使用熊猫。我需要从外国股票交易所下载一些股票,熊猫只支持美股。
  • 我认为您可以通过在股票代码前加上交易所代码来访问外国股票,例如LON:BARC 从伦敦证交所提取巴克莱银行的报价。
  • @bkcollection:更新答案以使用GoogleQuote 类...我想。
  • @mhwake,它有效!!更改 q = GoogleQuote(stock,start.strftime("%Y-%m-%d")) 工作正常。谢谢
  • @bkcollection:很好。您可能想投票并接受答案;)
猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 2021-07-10
  • 1970-01-01
  • 2013-04-01
  • 2020-02-26
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
相关资源
最近更新 更多