Преобразование необычного / пользовательского формата времени в объект datetime - PullRequest
0 голосов
/ 17 декабря 2018

У меня необычный формат даты и времени в моем наборе данных, который мне нужно преобразовать в пригодный для использования объект даты и времени.

Пример выглядит следующим образом: '1/3/2018 13:29:35 PM (UTC + 0)'

Я попытался разобрать его с помощью:

from dateutil.parser import parse
parse('1/3/2018 1:29:35 PM(UTC+0)')

но он не распознает формат.

Мой текущий обходной путь - это синтаксический анализ столбца datetime (данные в pandas dataframe) с использованием регулярного выражения в два столбца, например:

dataframe

и затем в зависимости от значения столбца 'utc' примените пользовательскую функцию convert_to_eastern.

Интересно, есть ли более простой способ выполнитьс использованием datetime.datetime.strptime ()?

Следующее не сработало:

import datetime as dt

my_time='1/3/2018 1:29:35 PM(UTC+0)'
dt.datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%z)')

Дополнение: Это не вопрос: «Как преобразовать часовой пояс UTC в местныйчасовой пояс "В моем наборе данных есть строки с UTC, а также строки с часовым поясом восточного региона.У меня проблема в том, что этот формат - не формат ISO, а какой-то удобный для восприятия пользовательский формат.

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Проблема с '+0' для вашего часового пояса 'UTC + 0'. datetime принимает только смещение utc в виде HHMM.Возможное решение:

import datetime as dt

my_time = '1/3/2018 1:29:35 PM(UTC+0)'
my_time=my_time.replace('+0','+0000')
dt.datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%Z%z)')
0 голосов
/ 17 декабря 2018

Вопрос : более простой способ сделать это с помощью datetime.datetime.strptime ()

Разделить строку даты на части: utc:[('1/3/2018 1:29:35 PM', '(UTC+0)', 'UTC', '+', '0')]
Перестроитьстрока даты, фиксирующая заполнение детали hour с 0 до 2 цифр.
Я предполагаю, что в детали UTC нет minutes, поэтому по умолчанию 00.

Если строка даты содержит более 2 UTC цифр, возвращает неизмененную строку даты.

Примечание : формат strptime должен быть %Z%z!
Документация: strftime-and-strptime-поведение

from datetime import datetime
import re

def fix_UTC(s):
    utc = re.findall(r'(.+?)(\((\w{3})(\+|\-)(\d{1,2})\))', s)
    if utc:
        utc = utc[0]
        return '{}({}{}{})'.format(utc[0], utc[2], utc[3], '{:02}00'.format(int(utc[4])))
    else:
        return s

my_time = fix_UTC('1/3/2018 1:29:35 PM(UTC+0)')
date = datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%Z%z)')
print("{} {}".format(date, date.tzinfo))

Выход :

2018-01-03 13:29:35+01:00 UTC

Проверено на Python: 3.4.2

0 голосов
/ 17 декабря 2018

Должно быть что-то вроде этого:

import datetime as dt

my_time='1/3/2018 1:29:35 PM(UTC+0000)'
tmp = dt.datetime.strptime(my_time, '%m/%d/%Y %I:%M:%S %p(%Z%z)')
print(tmp)

Большое «Z» для часового пояса (UTC, GMT и т. Д.), Маленькое «z» для дельты.Также вы должны добавить больше нулей к дельте.

...