【问题标题】:Python CSV file parsing into datetime, throwing time format errorPython CSV文件解析成日期时间,抛出时间格式错误
【发布时间】:2013-03-29 22:42:51
【问题描述】:

我正在使用 pygtk 和 glade(python 2.7 32 位解释器是它支持的最新版本)为研究部门制作应用程序,这需要从气象站的 csv 输出中获取一堆数据并试图搁置它用于永久本地存储的字典中的数据。但是,我似乎无法爬过将日期和时间信息存储到 datetime 对象的墙。无论我尝试以多少不同的方式获取日期和时间字段(表示为字符串 ex:"11/13/2012 17:43")并将其放入 datetime 对象中,我都会得到同样令人讨厌的错误:

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

现在对于有问题的代码,它是在 UI 上单击按钮时的事件:

def Bupload_clicked(self,widget):
  #Create a file chooser window, with default buttons
  chooser = gtk.FileChooserDialog("Open . .", None, gtk.FILE_CHOOSER_ACTION_OPEN,
     (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  response = chooser.run()

  if response == gtk.RESPONSE_OK: 
     with open(chooser.get_filename(), 'rb') as csvfile:
        reader = csv.reader(csvfile, delimiter='\t', quoting=csv.QUOTE_NONE)
        try:
           for row in reader: #loop through rows of data

              #here is the line of code in question:
              print repr(datetime.datetime(*time.strptime(row[1], "%m/%d/%Y %H:%M") [:5]))

              #rest of code doesn't work until this issue is fixed

        except csv.Error as e:
           sys.exit('file %s, line %d: %s' % (chooser.get_filename(), reader.line_num, e))
  chooser.destroy()

我尝试以多种不同的方式完成这项任务,使用网络上提出的类似问题,包括将“/”切换为“-”,将一行代码分成几行等,但是似乎没有什么能解决这个问题。

另外,在你想太多之前的一个附带问题:strptime() 的 python 文档说它为 %m 寻找 [01,12],为 %H 寻找 [00,24],为 % 寻找 [01,31] d 等。但气象站的 CSV 文件忽略了前导 0。 (例如:“2/1/2013 0:43”)这会导致错误吗?

来自 CSV 文件的原始数据(前 5 行):

1   11/13/2012 17:43    0   -0.2039 0   43.443  40.2    9.4 0   2.82    70.2    4.375
2   11/13/2012 18:43    0   -0.2039 0   36.651  61.1    0.6 0   0   74.4    4.363
3   11/13/2012 19:43    0   -0.1988 0   32.092  76.1    0.6 0   0.56    74.4    4.357
4   11/13/2012 20:43    0   -0.1988 0   31.591  74.5    0.6 0   1.12    92.7    4.357
5   11/13/2012 21:43    0   -0.1988 0   30.326  82.4    0.6 0   0   223.2   4.351

这是列表的“内存中”表示:

#replace the problem line of code with: print row

['1', '11/13/2012 17:43', '0', '-0.2039', '0', '43.443', '40.2', '9.4', '0', '2.82', '70.2', '4.375']
['2', '11/13/2012 18:43', '0', '-0.2039', '0', '36.651', '61.1', '0.6', '0', '0', '74.4', '4.363']
['3', '11/13/2012 19:43', '0', '-0.1988', '0', '32.092', '76.1', '0.6', '0', '0.56', '74.4', '4.357']
['4', '11/13/2012 20:43', '0', '-0.1988', '0', '31.591', '74.5', '0.6', '0', '1.12', '92.7', '4.357']
['5', '11/13/2012 21:43', '0', '-0.1988', '0', '30.326', '82.4', '0.6', '0', '0', '223.2', '4.351']

【问题讨论】:

  • 请显示文件内容的样本。
  • 您的代码看起来不错,CSV 文件后面的某个地方肯定有一些问题。在处理它们之前尝试打印这些行并查看哪一行引发了错误,或者捕获错误并打印错误的行。
  • 与问题无关,但可以直接从datetime使用strptimedatetime.datetime.strptime(row[1], "%m/%d/%Y %H:%M")
  • @PavelAnossov 吃完饭回来后我会从那条路开始,谢谢你的建议。

标签: python datetime csv pygtk glade


【解决方案1】:

问题不在于您的格式字符串。错误信息

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

表示您正在尝试将空字符串转换为时间。换句话说,对于文件的至少一行row[1] == '',您实际上是在调用time.strptime('', '%m/%d/%Y %H:%M')

【讨论】:

  • 该文件有一些不可见的字符标题,我发现第一次读取时搞砸了,我拿了一个 itertools.islice() 并从第二行开始读取,问题自行解决了,谢谢!!
猜你喜欢
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多