Преобразовать строку времени, выраженную как <number>[m | h | d | s | w], в секунды в Python - PullRequest
7 голосов
/ 23 июня 2010

Есть ли хороший метод для преобразования строки, представляющей время в формате [m | h | d | s | w] (m = минуты, h = часы, d = дни, s = секунды w = неделя) вколичество секунд?Т.е.

def convert_to_seconds(timeduration):
    ...

convert_to_seconds("1h")
-> 3600

convert_to_seconds("1d")
-> 86400

и т. Д.

Спасибо!

Ответы [ 4 ]

17 голосов
/ 23 июня 2010

Да, есть хороший простой метод, который вы можете использовать на большинстве языков , не читая руководство по библиотеке времени и даты .Этот метод также может быть экстраполирован на унции / фунты / тонны и т. Д. И т. Д .:

seconds_per_unit = {"s": 1, "m": 60, "h": 3600, "d": 86400, "w": 604800}

def convert_to_seconds(s):
    return int(s[:-1]) * seconds_per_unit[s[-1]]
8 голосов
/ 23 июня 2010

Я рекомендую использовать класс timedelta из модуля datetime:

from datetime import timedelta

UNITS = {"s":"seconds", "m":"minutes", "h":"hours", "d":"days", "w":"weeks"}

def convert_to_seconds(s):
    count = int(s[:-1])
    unit = UNITS[ s[-1] ]
    td = timedelta(**{unit: count})
    return td.seconds + 60 * 60 * 24 * td.days

Внутренне, timedelta объекты хранят все в виде микросекунд, секунд и дней.Таким образом, хотя вы можете задавать параметры в единицах, например, в миллисекундах, месяцах или годах, в конце вам придется взять созданный вами timedelta и преобразовать его в секунды.

В случае синтаксиса **вас смущает, это синтаксис Python apply .По сути, все эти вызовы функций эквивалентны:

def f(x, y): pass

f(5, 6)
f(x=5, y=6)
f(y=6, x=5)

d = {"x": 5, "y": 6}
f(**d)
0 голосов
/ 23 января 2019

Мне обычно требуется поддержка необработанных чисел, строковых чисел и строковых чисел, заканчивающихся на [m | h | d | s | w].

Эта версия будет обрабатывать: 10, "10", "10 с", "10 м", "10 ч", "10 д", "10 Вт".

Наконечник шляпы @Eli Courtwright's ответ на преобразование строки.

UNITS = {"s":"seconds", "m":"minutes", "h":"hours", "d":"days", "w":"weeks"}

def convert_to_seconds(s):
    if isinstance(s, int):
        # We are dealing with a raw number
        return s

    try:
        seconds = int(s)
        # We are dealing with an integer string
        return seconds
    except ValueError:
        # We are dealing with some other string or type
        pass

    # Expecting a string ending in [m|h|d|s|w]
    count = int(s[:-1])
    unit = UNITS[ s[-1] ]
    td = timedelta(**{unit: count})
    return td.seconds + 60 * 60 * 24 * td.days
0 голосов
/ 23 апреля 2018

Я написал библиотеку с открытым исходным кодом MgntUtils на Java (не php), которая частично отвечает этому требованию. Он содержит статический метод parsingStringToTimeInterval(String value), который анализирует строку, которая, как ожидается, будет содержать некоторое значение временного интервала - числовое значение с необязательным суффиксом единицы времени. Например, строка «38s» будет проанализирована как 38 секунд, «24m» - 24 минуты, «4h» - 4 часа, «3d» - 3 дня и «45» как 45 миллисекунд. Поддерживаются суффиксы «s» для секунд, «m» для минут, «h» для часов и «d» для дней. Считается, что строка без суффикса содержит значение в миллисекундах. Суффиксы нечувствительны к регистру. Если предоставленная строка содержит неподдерживаемый суффикс или содержит отрицательное числовое значение или ноль или содержит не числовое значение, то генерируется исключение IllegalArgumentException. Этот метод возвращает класс TimeInterval - класс, также определенный в этой библиотеке. По сути, он содержит два свойства с соответствующими геттерами и сеттерами: long «value» и java.util.concurrent.TimeUnit. Но в дополнение к методам получения и установки этот класс имеет методы toMillis (), toSeconds (), toMinutes (), toHours () toDays (). Эти методы возвращают длинное значение в указанном масштабе времени (так же, как соответствующие методы в классе java.util.concurrent.TimeUnit)

Этот метод может быть очень полезен для анализа свойств временных интервалов, таких как тайм-ауты или периоды ожидания из файлов конфигурации. Это устраняет ненужные вычисления от различных временных масштабов до миллисекунд назад и вперед. Учтите, что у вас есть свойство methodInvokingInterval, которое необходимо установить на 5 дней. Таким образом, чтобы установить значение в миллисекундах, вам необходимо рассчитать, что 5 дней - это 432000000 миллисекунд (очевидно, это не невыполнимая задача, но раздражает и подвержена ошибкам), а затем любой, кто увидит значение 432000000, должен будет рассчитать его до 5 дней, которые расстраивает Но используя этот метод, вы получите значение свойства "5d" и вызовете код

long seconds = TextUtils.parsingStringToTimeInterval("5d").toSeconds();

решит вашу проблему конверсии. Очевидно, что это не слишком сложная функция, но она может добавить простоту и ясность в ваши файлы конфигурации и сэкономить некоторое разочарование и «глупый» просчет в ошибках миллисекунд. Вот ссылка на статью, которая описывает библиотеку MgntUtils и где ее взять: MgntUtils

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...