【发布时间】: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使用strptime:datetime.datetime.strptime(row[1], "%m/%d/%Y %H:%M")。 -
@PavelAnossov 吃完饭回来后我会从那条路开始,谢谢你的建议。
标签: python datetime csv pygtk glade