使用Python 3.2和Matplotlib的strpdate2num时出现TypeError错误。

4

在我的当前项目中,我想使用以下代码从文本文件中读取一些实验数据到Python中:

import numpy as np
from matplotlib.dates import strpdate2num

data = np.recfromtxt('example.txt',
                 comments='#',
                 delimiter=';',
                 names=('time', 't_ref', 't_s', 't_amb1', 't_amb2', 't_amb3')
                 ,converters={'time': strpdate2num('"%d.%m.%Y %H:%M:%S"')}
                 )

假设 example.txt 的内容如下:

"04.10.2012 08:15:27";14.4;16;12.78;12.65;12.52
"04.10.2012 08:15:37";14.4;16;12.78;12.65;12.5
"04.10.2012 08:15:47";14.4;16;12.78;12.62;12.5
"04.10.2012 08:15:57";14.4;15.9;12.78;12.65;12.52
...

在 Python 2.7 中一切顺利,但当我尝试将代码转移到 3.2 时,从 strpdate2num() 得到一个 TypeError 错误。

TypeError: strptime() argument 0 must be str, not <class 'bytes'>

我对Python还比较新,但我的理论是NumPy在内部以字节而不是字符串的形式存储时间数组,这与Python 3之后更严格的处理方式发生了冲突。

长话短说,你有什么想法可以解决这个问题吗?

3个回答

6

这里有一个解决办法:

import numpy as np
import matplotlib.dates as mdates

def bytedate2num(fmt):
    def converter(b):
        return mdates.strpdate2num(fmt)(b.decode('ascii'))
    return converter

date_converter = bytedate2num("%d.%m.%Y %H:%M:%S")

data = np.recfromtxt('example.txt',
                     comments='#',
                     delimiter=';',
                     names=('time', 't_ref', 't_s', 't_amb1', 't_amb2', 't_amb3'),
                     converters={'time': date_converter})

6

unutbu的解决方法完美地解决了问题。同时,似乎问题已得到解决。对我而言,使用bytespdate2num()代替strpdate2num()即可。


1
这应该被标记为正确答案。正如JGras所提到的,Python 3用户应该这样导入bytespdate2num:from matplotlib.dates import bytespdate2num - kas

0

我必须从示例文本中删除引号。(使用python3.4)

ValueError: time data '"04.10.2012 08:15:27"' does not match format '%d.%m.%Y %H:%M:%S'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接