У меня проблемы с форматированием datetime.timedelta
объекта.
Вот что я пытаюсь сделать: у меня есть список объектов, и один из членов класса объекта - это объект timedelta, который показывает продолжительность события. Я хотел бы отобразить эту продолжительность в формате часов: минут.
Я испробовал множество способов сделать это, и у меня возникли трудности. Мой текущий подход заключается в добавлении методов в класс для моих объектов, которые возвращают часы и минуты. Я могу получить часы, разделив timedelta.seconds на 3600 и округлив его. У меня проблемы с получением оставшихся секунд и преобразованием их в минуты.
Кстати, я использую Google AppEngine с шаблонами Django для презентации.
datetime.utcfromtimestamp()
. Смотрите мой ответ ниже.__str__
изtimedelta
вполне приличных, в отличие от__repr__
(то есть - для людей). Например:datetime.timedelta(minutes=6, seconds=41) * 2618 / 48
даетdatetime.timedelta(seconds=21871, microseconds=208333)
, ноstr(datetime.timedelta(minutes=6, seconds=41) * 2618 / 48)
дает,'6:04:31.208333'
что вполне нормально читать.Ответы:
Вы можете просто преобразовать timedelta в строку с помощью str (). Вот пример:
источник
print 'some thing ' + str(delta)
ConvertDuration=datetime.timedelta(milliseconds=int(254459))
тогда вы просто используете split, чтобы вывести микросекунды из игры. С 0: 03: 43.765000 я могу получить 0:03:43 , просто запустивTotalDuration=str(ConvertDuration).split('.', 2)[0]
Как вы знаете, вы можете получить total_seconds из объекта timedelta, обратившись к
.seconds
атрибуту.Python предоставляет встроенную функцию,
divmod()
которая позволяет:или вы можете преобразовать в часы и остаток, используя комбинацию по модулю и вычитанию:
источник
abs(s)
.'%d:%02d:%02d'
начальные нули в выходной строке..seconds
если разница может быть отрицательной или более 24 часов (.seconds
атрибут игнорируется.days
). Используйте.total_seconds()
или его аналог вместо.Передача
timedelta
объекта вstr()
функцию вызывает тот же код форматирования, который используется, если мы просто печатаемprint td
. Поскольку вам не нужны секунды, мы можем разделить строку на двоеточия (3 части) и соединить ее вместе только с первыми 2 частями.источник
str(my_timedelta)
плохо работает для отрицательных чиселисточник
if seconds > period_seconds:
кif seconds >= period_seconds:
однако.Я лично использую
humanize
библиотеку для этого:Конечно, он не дает вам именно тот ответ, который вы искали (что действительно так,
str(timeA - timeB)
но я обнаружил, что по прошествии нескольких часов экран становится быстро нечитаемым),humanize
имеет поддержку гораздо больших значений, которые удобочитаемый, а также хорошо локализован.По-
contrib.humanize
видимому, он вдохновлен модулем Django , поэтому, поскольку вы используете Django, вам, вероятно, следует его использовать.источник
naturaltime
это то , что вы хотите использовать.У него уже есть объект timedelta, так почему бы не использовать его встроенный метод total_seconds () для преобразования его в секунды, а затем использовать divmod () для получения часов и минут?
Это работает независимо от того, имеет ли дельта времени четные дни или годы.
источник
Вот функция общего назначения для преобразования либо
timedelta
объекта, либо обычного числа (в виде секунд, минут и т. Д.) В красиво отформатированную строку. Я взял фантастический ответ mpounsett на дубликат вопроса, сделал его немного более гибким, улучшил удобочитаемость и добавил документацию.Вы найдете, что это самый гибкий ответ здесь, поскольку он позволяет вам:
Функция:
Демо-версия:
источник
Я знаю, что это старый ответ на вопрос, но я использую
datetime.utcfromtimestamp()
для этого. Он занимает количество секунд и возвращает значение,datetime
которое можно отформатировать, как и любое другоеdatetime
.Пока вы находитесь в допустимых пределах для временных интервалов, это должно работать, то есть оно не возвращает 1234: 35, поскольку часы <= 23.
источник
print timedelta(seconds=end - begin)
вместо этого..zfill(8)
если вам это нужно.Спрашивающий хочет более хороший формат, чем типичный:
Итак, на самом деле есть два формата: один, где дни равны 0, и он пропущен, а другой, где есть текст «n дней, ч: м: с». Но у секунд могут быть дроби, и в распечатках нет начальных нулей, поэтому столбцы грязные.
Вот моя рутина, если вам это нравится:
возвращает результат в формате дд: чч: мм: сс:
Я действительно думал о том, чтобы добавить к этому годы, но это оставлено читателю как упражнение, так как результат более 1 года:
источник
Я серьезно рассмотрел бы подход Бритвы Оккама здесь:
Это возвращает строку без микросекунд
Если вы хотите восстановить объект datetime.timedelta, просто сделайте это:
2 года я люблю этот язык!
источник
Мои
datetime.timedelta
объекты пошли больше, чем за день. Так что вот еще одна проблема. Все обсуждение выше предполагает менее одного дня. Аtimedelta
на самом деле это кортеж дней, секунд и микросекунд. Приведенное выше обсуждение следует использовать так,td.seconds
как это делал Джо, но если у вас есть дни, оно НЕ включается в значение секунд.Я получаю промежуток времени между двумя датами и печатными днями и часами.
источник
Для этого я использовал
humanfriendly
библиотеку python, она работает очень хорошо.Доступно по адресу https://pypi.org/project/humanfriendly/
источник
Следуя приведенному выше примеру Джо, я бы использовал арифметический оператор модуля:
Обратите внимание, что целочисленное деление в Python округляется по умолчанию; если вы хотите быть более явным, используйте math.floor () или math.ceil () в зависимости от ситуации.
источник
td.total_seconds()
вместо того,.seconds
чтобы заставить его работать с интервалами> 1 дня.источник
timedelta
объект имеет полеdays
,seconds
иmicroseconds
в документации.У меня была похожая проблема с выводом расчета сверхурочных на работе. Значение всегда должно отображаться в формате ЧЧ: ММ, даже если оно больше одного дня, и значение может стать отрицательным. Я объединил некоторые из показанных решений, и, возможно, кто-то найдет это решение полезным. Я понял, что если значение timedelta является отрицательным, большинство показанных решений с помощью метода divmod не работают из коробки:
timedelta в чч: мм строка:
источник
источник
Прямой шаблонный фильтр для этой проблемы. Встроенная функция int () никогда не округляется. F-строки (то есть f '') требуют Python 3.6.
источник
Это даст:
источник
Пожалуйста, проверьте эту функцию - она преобразует объект timedelta в строку «ЧЧ: ММ: СС»
источник
Один лайнер. Так как timedelt не предлагает strftime для datetime, верните timedelta к datetime и используйте stftime.
Это может не только обеспечить запрошенный формат OP. Часы: минуты, теперь вы можете использовать все возможности форматирования strftime datetime, если ваши требования изменятся на другое представление.
Это также устраняет раздражение от того, что временные интервалы форматируются в строки как H: MM: SS, а не HH: MM: SS, что приводит меня к этой проблеме и решению, которым я поделился.
источник
Если у вас уже есть timedelta obj, просто преобразуйте этот объект в строку. Удалите последние 3 символа строки и напечатайте. Это обрезает часть секунд и печатает оставшуюся часть в формате Часы: минуты.
источник
print t.split('.')[0]
Если
IPython
в ваших пакетах есть (вы должны это сделать), он имеет (до сих пор, во всяком случае) очень хороший форматер для длительностей (в секундах с плавающей запятой). Это используется в различных местах, например,%%time
магией клеток. Мне нравится формат, который он производит на короткие промежутки времени:источник
Таким образом, для:
возвращает:
источник
Спасибо всем за вашу помощь. Я взял много твоих идей и соединил их, дай мне знать, что ты думаешь.
Я добавил в класс два метода:
В моем django я использовал это (сумма - объект, и это находится в словаре):
источник