Как разобрать строку времени без даты и строку даты без времени? - PullRequest
0 голосов
/ 08 января 2019

Есть ли способ автоматического разбора строк со временем только на datetime.time объект (или что-то подобное)? То же самое для datetime.date.

Я пробовал dateutil , стрелка , момент , pandas.to_datetime . Все эти парсеры создают метки времени с текущей датой.

>>> from dateutil.parser import parse
>>> parse('23:53')
datetime.datetime(2019, 1, 8, 23, 53)  # datetime.time(23, 53) expected
>>> parse('2018-01-04')
datetime.datetime(2018, 1, 4, 0, 0)  # datetime.date(2018, 1, 4) expected

UPD:

Спасибо за ответы. Думаю, что я должен прояснить проблему.

Программа не знает, что будет на входе (timestamp, date или time), и она должна решить установить соответствующий тип. Проблема состоит в том, чтобы различать эти типы.

Например, я могу разобрать 23:53 и получить метку времени. Как я могу решить извлечь из этого время или нет?

Ответы [ 4 ]

0 голосов
/ 08 января 2019

Вы можете использовать модули времени или даты и времени, но следует иметь в виду, что они всегда создают объект, который определяет момент времени. (Также при разборе строк рассмотрите возможность использования функции strptime и отображения в виде строки, соответственно функции strftime)

, например

>>> hours = time.strptime("23:59", "%H:%M")
>>> days = time.strptime("2018-01-04", "%Y-%m-%d")
>>> time.strftime("%H:%M", hours)
'23:59'
>>> time.strftime("%H:%M %Y", hours)
'23:59 1900'

Не рекомендуется, но если по какой-то причине вы хотите разделить эти два объекта и хотите позаботиться только о конкретной части вашего задания, вы все равно можете указать соответствующие номера с помощью

>>> hours.tm_hour
23
>>> hours.tm_min
59

>>> days.tm_mon
1
>>> days.tm_mday
4
>>> days.tm_year
2018

Гораздо лучшим подходом, на мой взгляд, было бы форматирование полной строки даты и использование strptime для формирования полной метки времени - даже если вы получаете время и дату как отдельные входные данные:

>>> ttime = "22:45" 
>>> dday = "2018-01-04"

Вы можете использовать% formatter или "новые" python f-Strings

>>> complete_t_string = "{} {}".format(dday, ttime)
>>> complete_t_string
'2018-01-04 22:45'

Теперь, когда у нас есть полная строка, мы можем указать, как она должна читаться, и создать полную метку времени:

>>> complete_time = time.strptime(complete_t_string, "%Y-%m-%d %H:%M")
>>> complete_time
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=4, tm_hour=22, tm_min=45, tm_sec=0, tm_wday=3, tm_yday=4, tm_isdst=-1)

EDIT: Кто-то, вероятно, убьет меня, но если вы абсолютно точно знаете, что вы получите только два типа значений, вы можете просто выполнить конструкцию try / кроме. Это, вероятно, можно написать более Pythonically:

try:
    time.strptime(t_string, "%H:%M")
except ValueError:
    time.strptime(t_string, "%Y-%m-%d")
0 голосов
/ 08 января 2019

Вот вам пример. Просто установите атрибуты даты с помощью replace и выберите выходные данные с помощью strftime.

import datetime
date = datetime.datetime.now()
newdate = date.replace(hour=11, minute=59)
print(newdate.strftime('%H:%M'))
newdate2 = date.replace(year=2014, month=1, day=3)
print(newdate2.strftime('%Y-%m-%d'))
0 голосов
/ 08 января 2019

В основном вы хотите, чтобы '23: 53' стал объектом datetime.time, а '2018-01-04' - объектом datetime.date. Этого нельзя достичь с помощью dateutil.parser.parse():

Возвращает объект datetime.datetime или, если опция fuzzy_with_tokens равна True, возвращает кортеж, первый элемент - объект datetime.datetime, второй - кортеж, содержащий нечеткие токены.

Из документации . Таким образом, вы всегда получите объект datetime.datetime при использовании dateutil.parser.parse()

Я думаю, вам нужно интерпретировать входную строку самостоятельно, чтобы определить, пытаетесь ли вы проанализировать время или дату. Когда вы сделаете это, вы все равно сможете использовать функцию dateutil.parser.parse(), чтобы получить нужный объект:

from dateutil.parser import parse
my_time = parse('23:53')
my_time.time()  # datetime.time(23, 53)
my_time.date()  # datetime.date(2019, 1, 8)
0 голосов
/ 08 января 2019

Вы можете использовать fromisoformat() из datetime.

import datetime
datetime.time.fromisoformat('23:53')
datetime.date.fromisoformat('2018-01-04')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...