numpy.genfromtxt () dtype для анализа строки даты и времени с AM / PM - PullRequest
0 голосов
/ 08 июня 2018

У меня есть несколько файлов данных с тысячами записей, таких как:

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, используя numpy.genfromtxt(), например:

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

К сожалению, я не могу определить правильный кортеж формата dtype для поля trn_date, чтобы эти строки даты-времени были правильно проанализированы, потому что они используют суффиксы AM / PM вместо того, чтобы находиться в «военном времени».

Любая помощь будетоценили.Я пытался RTFM ...

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Проблема здесь заключается в том, что numpy.getfromtxt () анализирует дату и время в формате: «ГГГГ-ММ-ДДТ00: 00: 00», например, 2018-05-27T01: 45: 45 ' См.документы

Решение состоит в том, чтобы переписать текст в этот формат.Есть несколько способов сделать это, например, создать новый файл или, возможно, использовать 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 был прав, хотя!

0 голосов
/ 08 июня 2018

Вам может потребоваться передать пользовательский конвертер, используя datetime.datetime.strptime для дат с аргументом converters=, поскольку разбор даты и времени NumPy не является сверхгибким за пределами ISO8601 формат.

Если вы посмотрите на таблицу кодов формата для strptime, вы увидите, что она может обрабатывать AM / PM с помощью директивы %p.

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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...