使用numpy读取自定义格式化日期时间

时间:2016-01-18 17:25:30

标签: python datetime numpy

我正在尝试从某些文件中加载时间序列数据。数据具有此格式

04/02/2015 19:07:53.951,3195,1751,-44,-25

我正在使用此代码将整个文件作为numpy对象加载。

 content = np.loadtxt(filename, dtype={'names': ('timestamp', 'tick', 'ch', 'NodeI', 'Base'),
                                      'formats': ('datetime64[us]', 'i4', 'i4', 'i4', 'i4')}, delimiter=',', skiprows=27)

但是我的日期时间格式错误

ValueError: Error parsing datetime string "04/02/2015 19:07:53.951" at position 2

有一种简单的方法可以定义我正在阅读的日期时间格式吗?有大量数据的文件所以我试图不要多次遍历文件。

2 个答案:

答案 0 :(得分:2)

使用converters参数将转换器函数应用于第一列的数据:

import datetime

def parsetime(v): 
    return np.datetime64(
        datetime.datetime.strptime(v, '%d/%m/%Y %H:%M:%S.%f')
    )

content = np.loadtxt(
    filename, 
    dtype={
        'names': ('timestamp', 'tick', 'ch', 'NodeI', 'Base'),
        'formats': ('datetime64[us]', 'i4', 'i4', 'i4', 'i4')
    }, 
    delimiter=',', 
    skiprows=27,
    converters={0: parsetime},
)

我假设您的数据文件正在使用D/M/Y,如果您使用的是M/D/Y,请相应地调整格式字符串。

答案 1 :(得分:2)

我建议使用pandas库和read_csv,您可以使用parse_dates选择列并设置infer_datetime_format将其转换为日期时间格式:

import pandas as pd
a=pd.read_csv('nu.txt',parse_dates=[0],infer_datetime_format=True,sep=',',header=None)

a.iloc[:,0]



0   2015-04-02 19:07:53.951
1   2015-04-02 19:07:53.951
2   2015-04-02 19:07:53.951
3   2015-04-02 19:07:53.951
Name: 0, dtype: datetime64[ns]
# assumes file with four identical rows and no header

此外,如果需要,很容易转换为numpy:

b=np.array(a)
array([[Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L],
       [Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L],
       [Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L],
       [Timestamp('2015-04-02 19:07:53.951000'), 3195L, 1751L, -44L, -25L]], dtype=object)