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 中传输代码时,我得到了TypeError一个strpdate2num()说法

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

我对 Python 相当陌生,但我的理论是 NumPy 以某种方式在内部将时间数组存储为字节而不是字符串,这与自 Python 3 以来对两者的更严格处理相冲突。

长话短说,您知道如何解决该问题的原因可能是什么吗?

4

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})
于 2013-05-11T10:37:50.847 回答
6

unutbu的解决方法工作得很好。与此同时,这个问题似乎已经得到解决。使用bytespdate2num()代替strpdate2num()对我有用。

于 2016-10-03T12:13:40.397 回答
0

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

ValueError: time data '"04.10.2012 08:15:27"' does not match format '%d.%m.%Y %H:%M:%S'
于 2014-11-27T14:27:35.517 回答