【问题标题】:ValueError: Traceback (most recent call last) <ipython-input-15-d27c936e2293> in <module>()ValueError: Traceback (最近一次调用最后一次) <ipython-input-15-d27c936e2293> in <module>()
【发布时间】:2018-10-11 02:06:27
【问题描述】:

我正在尝试从 csv 文件中读取数据,但出现此错误:


ValueError                                Traceback (most recent call last)
<ipython-input-15-d27c936e2293> in <module>()
 11 for row in header:
 12     # row = [Date, Open, High, Low, Close, Volume, Adj. close]
---> 13     date = datetime.strptime(row[0], '%m/%d/%Y')
     14     open_price = float(row[1])
     15     high = float(row[2])

~/anaconda3/lib/python3.6/_strptime.py in _strptime_datetime(cls, data_string, format)
563     """Return a class cls instance based on the input string and the
564     format string."""
--> 565     tt, fraction = _strptime(data_string, format)
566     tzname, gmtoff = tt[-2:]
567     args = tt[:6] + (fraction,)

~/anaconda3/lib/python3.6/_strptime.py in _strptime(data_string, format)
360     if not found:
361         raise ValueError("time data %r does not match format %r" %
--> 362                          (data_string, format))
363     if len(data_string) != found.end():
364         raise ValueError("unconverted data remains: %s" %

ValueError: time data 'D' does not match format '%m/%d/%Y'

这是我的代码:

import csv 
from datetime import datetime 

path ="google_stock_data.csv"
file = open (path, newline = '')
reader = csv.reader(file)

header = next (reader)

data = [] 
for row in header: 
# row = [Date, Open, High, Low, Close, Volume, Adj. close]
   date = datetime.strptime(row[0], '%m/%d/%Y')
   open_price = float(row[1])
   high = float(row[2])
   low = float(row[3])
   close = float(row[4])
   volume = float(row[5])
   adj_close = float(row[6])

data.append([date, open_price, high, low, close, volume, adj_close])

print(data[0])

注意:文件中的数据如下所示:

Date      Open        High        Low          Close      Volume      Adj Close

8/19/14 585.002622  587.342658  584.002627  586.862643  978600  586.862643
8/18/14 576.11258   584.512631  576.002598  582.162619  1284100 582.162619
8/15/14 577.862619  579.382595  570.522603  573.482626  1519100 573.482626
8/14/14 576.182596  577.902645  570.882599  574.652582  985400  574.652582

这是为什么呢?数据不是被转换为正确的类型吗?请帮忙。我该如何解决?

谢谢。

【问题讨论】:

  • 你能把google_stock_data.csv的内容发一个sn-p吗?
  • 日期打开高低关闭音量调关闭14年8月19日585.002622 587.342658 584.002627 586.862643 586.862643 978600 14年8月18日576.11258 584.512631 576.002598 582.162619 582.162619 1284100 14年8月15日577.862619 579.382595 570.522603 573.482626 573.482626 1519100 8 /14/14 576.182596 577.902645 570.882599 574.652582 985400 574.652582
  • for row in header 循环遍历标题,而不是数据行。近距离投票是错字。
  • 应该是FileHandle = open("google_stock_data.csv", "r") for line in FileHandle:with open("google_stock_data.csv") as FileHandle:

标签: python file csv


【解决方案1】:

您的示例代码很接近,但存在一些问题: 首先,for循环有错别字,应该是

for row in reader:

其次,日期时间解析器似乎不支持月份和日期不为零填充的日期格式。因此,使用 dateutil.parser:

from dateutil.parser import parse
date = parse(row[0], dayfirst=False)

最后,csv 不喜欢字段之间有多个空格。但是您可以定义自己的方言来解决它:

csv.register_dialect('dataformat', delimiter=' ', skipinitialspace=True)
reader = csv.reader(file, dialect='dataformat')

skipinialspace 会占用字段之间的额外空格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2021-11-18
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多