Mam problem z formatowaniem datetime.timedelta
obiektu.
Oto, co próbuję zrobić: Mam listę obiektów, a jednym z członków klasy obiektu jest obiekt timedelta, który pokazuje czas trwania zdarzenia. Chciałbym wyświetlić ten czas w formacie godzin: minut.
Wypróbowałem różne metody, aby to zrobić i mam trudności. Moje obecne podejście polega na dodawaniu metod do klasy dla moich obiektów, które zwracają godziny i minuty. Mogę uzyskać godziny, dzieląc timedelta.seconds przez 3600 i zaokrąglając go. Mam problem z uzyskaniem pozostałych sekund i przeliczeniem ich na minuty.
Nawiasem mówiąc, do prezentacji używam Google AppEngine z szablonami Django.
datetime.utcfromtimestamp()
. Zobacz moją odpowiedź poniżej.__str__
oftimedelta
jest całkiem przyzwoite, w przeciwieństwie do__repr__
(to znaczy - dla ludzi!). Na przykład:datetime.timedelta(minutes=6, seconds=41) * 2618 / 48
dajedatetime.timedelta(seconds=21871, microseconds=208333)
, alestr(datetime.timedelta(minutes=6, seconds=41) * 2618 / 48)
daje,'6:04:31.208333'
co jest w porządku do przeczytania.Odpowiedzi:
Możesz po prostu przekonwertować timedelta na ciąg za pomocą str (). Oto przykład:
źródło
print 'some thing ' + str(delta)
ConvertDuration=datetime.timedelta(milliseconds=int(254459))
po prostu używasz podziału, aby wyłączyć mikrosekundy z gry. Od 0: 03: 43.765000 Mogę uzyskać 0:03:43 po prostu uruchamiającTotalDuration=str(ConvertDuration).split('.', 2)[0]
Jak wiesz, możesz uzyskać total_seconds z obiektu timedelta, uzyskując dostęp do
.seconds
atrybutu.Python zapewnia wbudowaną funkcję,
divmod()
która pozwala na:lub możesz przeliczyć na godziny i resztę, używając kombinacji modulo i odejmowania:
źródło
abs(s)
.'%d:%02d:%02d'
początkowych zer w ciągu wyjściowym..seconds
jeśli różnica może być ujemna lub dłuższa niż 24 godziny (.seconds
atrybut ignoruje.days
)..total_seconds()
Zamiast tego użyj lub jego analogu.Przekazywanie
timedelta
obiektu dostr()
funkcji wywołuje ten sam kod formatowania, który jest używany, jeśli po prostu piszemyprint td
. Ponieważ nie chcesz sekund, możemy podzielić ciąg na dwukropki (3 części) i złożyć z powrotem tylko dwie pierwsze części.źródło
str(my_timedelta)
źle działa dla liczb ujemnychźródło
if seconds > period_seconds:
naif seconds >= period_seconds:
.Osobiście korzystam z
humanize
biblioteki do tego:Oczywiście nie daje dokładnie takiej odpowiedzi, jakiej szukałeś (co w rzeczywistości jest,
str(timeA - timeB)
ale odkryłem, że gdy przekroczysz kilka godzin, wyświetlacz staje się szybko nieczytelny.humanize
Ma obsługę znacznie większych wartości, które są czytelny dla człowieka, a także dobrze zlokalizowany.contrib.humanize
Najwyraźniej jest zainspirowany modułem Django , więc skoro używasz Django, prawdopodobnie powinieneś go użyć.źródło
naturaltime
to jest to, czego chcesz użyć.Ma już obiekt timedelta, więc dlaczego nie skorzystać z wbudowanej metody total_seconds (), aby przekonwertować go na sekundy, a następnie użyć divmod (), aby uzyskać godziny i minuty?
Działa to niezależnie od tego, czy delta czasu ma nawet dni, czy lata.
źródło
Oto funkcja ogólnego przeznaczenia do konwersji
timedelta
obiektu lub zwykłej liczby (w postaci sekund lub minut itp.) Na ładnie sformatowany ciąg. Wziąłem fantastyczne odpowiedź mpounsett jest na duplikatu pytanie, czyni ją nieco bardziej elastyczne, poprawę czytelności i dodał dokumentacji.Przekonasz się, że jest to jak dotąd najbardziej elastyczna odpowiedź, ponieważ pozwala na:
Funkcjonować:
Próbny:
źródło
Wiem, że to stare pytanie, na które udzielono odpowiedzi, ale używam
datetime.utcfromtimestamp()
tego. Zajmuje to liczbę sekund i zwraca wartość,datetime
którą można sformatować jak każdą innądatetime
.Dopóki przebywasz w dozwolonych przedziałach czasowych, powinno to działać, tzn. Nie zwraca 1234: 35, ponieważ godziny wynoszą <= 23.
źródło
print timedelta(seconds=end - begin)
zamiast tego..zfill(8)
jeśli potrzebujesz.Pytający chce ładniejszego formatu niż typowy:
Tak więc naprawdę istnieją dwa formaty, jeden, w którym dni mają wartość 0 i jest pominięty, a drugi, w którym jest tekst „n dni, h: m: s”. Ale sekundy mogą mieć ułamki i na wydrukach nie ma zer wiodących, więc kolumny są nieuporządkowane.
Oto moja rutyna, jeśli ci się podoba:
zwraca wynik w formacie dd: hh: mm: ss:
Zastanawiałem się nad dodaniem do tego lat, ale jest to ćwiczenie dla czytelnika, ponieważ dane wyjściowe są bezpieczne przez ponad 1 rok:
źródło
Poważnie rozważyłbym tutaj podejście brzytwy Ockhama:
Zwraca ciąg bez mikrosekund
Jeśli chcesz ponownie wygenerować obiekt datetime.timedelta, wykonaj następujące czynności:
Za 2 lata uwielbiam ten język!
źródło
Moje
datetime.timedelta
przedmioty były większe niż jeden dzień. Oto kolejny problem. Cała powyższa dyskusja zakłada niecały dzień. Atimedelta
jest krotką dni, sekund i mikrosekund. Powyższa dyskusja powinna być wykorzystanatd.seconds
tak jak Joe, ale jeśli masz dni, NIE jest ona uwzględniana w wartości sekund.Dostaję przedział czasu między 2 czasami danych a drukowaniem dni i godzin.
źródło
Użyłem do tego
humanfriendly
biblioteki Pythona, działa bardzo dobrze.Dostępne na https://pypi.org/project/humanfriendly/
źródło
Podążając za powyższą przykładową wartością Joe, użyłbym operatora arytmetycznego modułu:
Zauważ, że podział liczb całkowitych w Pythonie domyślnie zaokrągla w dół; jeśli chcesz być bardziej precyzyjny, użyj odpowiednio math.floor () lub math.ceil ().
źródło
td.total_seconds()
zamiast,.seconds
aby działało w odstępach> 1 dzień.źródło
timedelta
obiekt ma poladays
,seconds
amicroseconds
dokumentacja.Miałem podobny problem z wynikami obliczeń nadgodzin w pracy. Wartość powinna zawsze pojawiać się w GG: MM, nawet jeśli jest większa niż jeden dzień, a wartość może stać się ujemna. Połączyłem niektóre z przedstawionych rozwiązań i być może ktoś inny uzna to rozwiązanie za przydatne. Uświadomiłem sobie, że jeśli wartość timedelta jest ujemna, większość pokazanych rozwiązań metodą divmod nie działa od razu:
timedelta do HH: MM ciąg:
źródło
źródło
Prosty filtr szablonów dla tego problemu. Wbudowana funkcja int () nigdy nie zaokrągla w górę. Ciągi F (tj. F '') wymagają Pythona 3.6.
źródło
Spowoduje to:
źródło
Sprawdź tę funkcję - konwertuje obiekt timedelta na ciąg „HH: MM: SS”
źródło
Jedna wkładka. Ponieważ timedeltas nie oferuje stretimeime datetime, przywróć timedelta do datetime i użyj stftime.
Może to nie tylko osiągnąć żądany format PO Godziny: Minuty, teraz możesz w pełni wykorzystać możliwości formatowania strtimeime datetime, jeśli twoje wymagania zmienią się na inną reprezentację.
To rozwiązuje również irytację, że timedeltas są formatowane w łańcuchy jako H: MM: SS zamiast HH: MM: SS, co doprowadziło mnie do tego problemu i rozwiązania, które udostępniłem.
źródło
Jeśli masz już obiekt timedelta obj, po prostu przekonwertuj go na ciąg znaków. Usuń 3 ostatnie znaki ciągu i wydrukuj. Spowoduje to obcięcie części sekund i wydrukowanie reszty w formacie Godziny: Minuty.
źródło
print t.split('.')[0]
Jeśli zdarzy ci się mieć
IPython
w swoich pakietach (powinieneś), to ma (do tej pory i tak) bardzo fajny formatator na czas trwania (w sekundach zmiennoprzecinkowych). Jest to wykorzystywane w różnych miejscach, na przykład przez%%time
magię komórkową. Podoba mi się format, który produkuje przez krótki czas:źródło
Więc dla:
zwroty:
źródło
Dziękuję wszystkim za pomoc. Wziąłem wiele twoich pomysłów i zebrałem je razem, daj mi znać, co myślisz.
Dodałem do tej metody dwie metody:
W moim django użyłem tego (suma jest obiektem i znajduje się w słowniku):
źródło