Секунды с эпохи до относительной даты - PullRequest
7 голосов
/ 14 января 2011

Я работаю с датами с эпохи, и уже получил, например:

date = 6928727.56235

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

Используя time.gmtime (date), он вернул

year=1970, mon=3, day=22, hour=4, min=38, sec=47

Я думаю, что эпоха начинается в «01/01/1970 00:00:00», поэтому метод должен возвращать относительную дату в виде:

'2 months 21 days 04:38:47'

Что-нибудь, что поможет?

Ответы [ 4 ]

5 голосов
/ 14 января 2011

Метод должен возвращать относительную дату в следующем виде: '2 месяца 22 дня 04: 38: 47'

Вы не можете сделать это, поскольку месяц находится между 28и 31 деньУтверждение «2 месяца и 22 дня» может означать что угодно от 81 до 84 дней.(Или между 78 и 84 днями, если месяцы не должны быть последовательными).

То, что вы хотите, просто бессмысленно.Относительное время даты может быть подсчитано только в днях, часах и секундах, пока разница не станет настолько большой, что количество дней больше не будет иметь значения, и в этом случае вы можете начать отсчет в месяцах или годах (но тогда вы не можете включать днибольше).

Таким образом, вы можете сказать «пять лет и два месяца», или «80 дней и три часа», или «двести лет».Но нельзя сказать «два месяца и три дня» или «пять лет и 20 дней».Заявления просто не имеют смысла.

Поэтому правильный ответ действительно eumiros

timedelta(seconds=6928727.56235)

Но теперь вы также знаете, почему.

(Если, конечно,, вы с месяцем фактически имеете ввиду лунные циклы, которые do имеют фиксированную длину.:))

4 голосов
/ 14 января 2011
from datetime import timedelta

a = timedelta(seconds=6928727.56235)

# a is now datetime.timedelta(80, 16727, 562350)

print "%d days %02d:%02d:%02d" % (a.days, a.seconds / 3600, (a.seconds / 60) % 60, a.seconds % 60)

Возвращает 80 days 04:38:47, что правильно, но не совсем то, что хотел OP (80 дней вместо 2 месяцев 21 день)

1 голос
/ 14 января 2011

time.gmtime возвращает объект ParseTuple, и вы можете использовать отдельные элементы кортежа для расчета.Как то так

>>> time_epoch = time.gmtime(0)
>>> time_at_hand = time.gmtime(6928727.56235)
>>> print "It's been %d days somewhat like  %d months, %d days and %d hours, %d  minutes, %d seconds " % (time_at_hand.tm_yday - time_epoch.tm_yday, time_at_hand.tm_mon - time_epoch.tm_mon , time_at_hand.tm_mday - time_epoch.tm_mday, time_at_hand.tm_hour - time_epoch.tm_hour, time_at_hand.tm_min - time_epoch.tm_min, time_at_hand.tm_sec - time_epoch.tm_sec)
It's been 80 days somewhat like  2 months, 21 days and 4 hours, 38  minutes, 47 seconds 
0 голосов
/ 02 июня 2019

Аналогично ответу Эумиро, но не нужно делить на 60 и т. Д. - вместо этого используйте Pandas Отметка времени и возьмите разницу с начала эпохи.

date = 6928727.56235
import pandas as pd
pd.Timestamp(datetime.fromtimestamp(date))-pd.Timestamp(datetime.fromtimestamp(0))

возвращает

Timedelta('80 days 04:38:47.562350')
...