numpy.genfromtxt()dtype用AM / PM

时间:2018-06-07 22:32:46

标签: python numpy datetime

我有几个包含数千条记录的数据文件:

4844,05/24/18 07:30:00 AM,75.312,0.428
4845,05/24/18 07:40:00 AM,75.312,0.435
4846,05/24/18 07:50:00 AM,75.312,0.429

我试图使用numpy.genfromtxt()将其拉入NumPy,如下所示:

data = np.genfromtxt(file_name, dtype=[('recordId','i8')
    , ('trn_date','datetime64[s]'), ('temperature','f8'), ('depth','f8')]
    , delimiter=',', skip_header=2)

不幸的是,我无法弄清楚trn_date字段的正确dtype格式元组,以便正确解析这些日期时间字符串,因为它们使用AM / PM后缀而不是处于"军事时间"。

任何帮助将不胜感激。我试过RTFM ......

2 个答案:

答案 0 :(得分:2)

由于NumPy日期时间解析超出ISO 8601格式的datetime.datetime.strptime,您可能需要为converters=参数的日期传入一个利用isn't super flexible的自定义转换器。

如果您查看strptime的{​​{3}},可以看到它可以使用%p指令处理AM / PM。

import datetime as dt

def date_parser(d_bytes):
    s = d_bytes.decode('utf-8')
    return np.datetime64(dt.datetime.strptime(s, '%m/%d/%y %I:%M:%S %p'))

data = np.genfromtxt(
    # ... 
    converters={1: date_parser})

答案 1 :(得分:0)

麻烦在于numpy.getfromtxt()解析日期时间的格式为:'YYYY-MM-DDT00:00:00' 例如'2018-05-27T01:45:45' See the docs

解决方案是将文本重新写入此格式。有很多方法可以做到这一点,比如制作一个新文件,或者使用StringIO。

以下是清理文本并将其写入新文件的示例:

with open(input_text, 'r') as file_io:
    for line in file_io: 
        split_line = line.split(',')
        split_datetime = split_line[1].split(' ')
        print(split_datetime)
        split_date = split_datetime[0].split('/')
        print(split_date)
        #put the date back in
        fixed_datetime = '20' + split_date[2] \
                          + '-' + split_date[0] \
                          + '-' + split_date[1] \
                          + 'T' + split_datetime[1]

        prepared_text = prepared_text + split_line[0] + ',' \
                                      + fixed_datetime[1] + ',' \
                                      + split_line[2] + ',' \
                                      + split_line[3] 

secondary_file = 'secondary_data_file.txt'

with open(secondary_file, 'w') as sec_file_io:
    sec_file_io.write(prepared_text)

你可以用不同的方式做到这一点。你dtype是对的!