Как преобразовать время "сейчас-5m" в объект datetime в python - PullRequest
0 голосов
/ 06 мая 2019

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

1) в виде строки в следующем формате: 1970-01-01T00: 00: 00

2) "now-5m"

3) "now-1h"

или аналогичные комбинации с минимальным, вторым или четным днем, я хочу получить время, которое на x минут старше указанноговремя, что было бы лучшим способом сделать это?Есть ли какая-нибудь библиотека, которая может обрабатывать все эти форматы и давать мне дату и время в каком-то унифицированном формате?

Ответы [ 4 ]

2 голосов
/ 06 мая 2019

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

Пример кода

import dateparser
from dateutil.relativedelta import relativedelta

print(dateparser.parse("now"))
print(dateparser.parse("now-30s"))
print(dateparser.parse("now-5m"))
print(dateparser.parse("1970-01-01T00:00:00"))
print(dateparser.parse("1970/01/01T00:00:00"))
print(type(dateparser.parse("1970/01/01T00:00:00")))
dt = dateparser.parse("now-5m")
print(dt - relativedelta(minutes=10)) # equals to now -15 min

выход ::

2019-05-06 12: 55: 54.074220

2019-05-06 12: 55: 24.076534

2019-05-06 12: 50: 54.077823

1970-01-01 00: 00: 00

1970-01-01 00: 00: 00

2019-05-06 12: 40: 54.087881

Вы можете прочитать больше на: * https://pypi.org/project/dateparser/

2 голосов
/ 06 мая 2019

Вы смотрите на datetime модуль python. Мы используем datetime.strptime для преобразования строки datetime в объект datetime, затем используем datetime.timedelta для выполнения таких операций, как вычитание минут и часов

import datetime

#Convert the string to datetime object
dt = datetime.datetime.strptime('1970-01-01T00:00:00', '%Y-%m-%dT%H:%M:%S')

#Subtract 5 minutes from the time
print(dt - datetime.timedelta(minutes=5))

#Subtract 1 hour from the time
print(dt - datetime.timedelta(hours=1))

Выход будет 1969-12-31 23:55:00

Кроме того, вы также можете посмотреть библиотеку dateutil , которая дает вам dateutil.relativedelta , в которой вы также можете указать годы, дни и месяцы

import datetime
from dateutil.relativedelta import relativedelta

#Convert the string to datetime object
dt = datetime.datetime.strptime('1970-01-01T00:00:00', '%Y-%m-%dT%H:%M:%S')

#Subtract 5 minutes from the time
print(dt - relativedelta(days=5))

#Subtract 1 hour from the time
print(dt - relativedelta(month=1))

Вывод здесь будет

1969-12-27 00:00:00
1970-01-01 00:00:00

Теперь, чтобы не указывать hours,minutes,days и т. Д. В качестве аргумента, вы можете преобразовать их все в стандартный формат (скажем, seconds и minutes), а затем использовать его.

Так, например, если вы хотите вычесть час и 5 минут, вы можете просто вычесть 65 минут

#Subtract 65 minutes from the time
print(dt - relativedelta(minutes=5))

#Subtract 1 hour and 5 minutes from the time
print(dt - relativedelta(hours=1, minutes=5))

Может быть, вы можете написать функцию, которая получает строку типа 5m, 1h, 2d в качестве ввода и дает вам минуты в ответ

def get_minutes(s):

    if 'm' in s:
        return int(s.replace('m',''))

    elif 'h' in s:
        return int(s.replace('h', ''))*60

    elif 'd' in s:
        return int(s.replace('d', ''))*1440

print(get_minutes('5m'))
#5
print(get_minutes('1h'))
#60
print(get_minutes('2d'))
#2880

Затем вы можете использовать это в вашей функции timedelta или relativedelta, возможно, расширить эту функцию, чтобы включить больше типов временных строк Точно так же вы можете придумать стандартное время, в которое вы переводите все свое время, а затем использовать его в аргументе!

1 голос
/ 06 мая 2019

Идея для 2), 3) случаев, которые будут проверены и уточнены:

import pandas as pd
import datetime as dt

def fuzzy_parse(t): return dt.datetime.utcnow() - pd.Timedelta(t.split("-")[1])

print(dt.datetime.utcnow(), fuzzy_parse("now-1s"))
print(dt.datetime.utcnow(), fuzzy_parse("now-1m"))
print(dt.datetime.utcnow(), fuzzy_parse("now-1h"))
print(dt.datetime.utcnow(), fuzzy_parse("now-1d"))
print(dt.datetime.utcnow(), fuzzy_parse("now-1w"))

Вывод:

2019-05-06 11:24:12.347120 2019-05-06 11:24:11.347125
2019-05-06 11:24:12.347388 2019-05-06 11:23:12.347391
2019-05-06 11:24:12.347554 2019-05-06 10:24:12.347557
2019-05-06 11:24:12.347710 2019-05-05 11:24:12.347712
2019-05-06 11:24:12.347863 2019-04-29 11:24:12.347865
1 голос
/ 06 мая 2019

Вы можете объединить часы и минуты следующим образом:

import datetime

#Convert the string to datetime object
dt = datetime.datetime.strptime('1970-01-01T00:00:00', '%Y-%m-%dT%H:%M:%S')

#Subtract one hour and 5 minutes together :)
print(dt - datetime.timedelta(hours=1, minutes=5))

Возвращает:

1969-12-31 22:55:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...