2016-11-25 2 views
4

dateutil der timedelta Objekt erscheint eine benutzerdefinierte __str__ Methode zu haben:Wie ein Timedelta in eine Zeichenfolge konvertieren und wieder zurück

In [1]: from datetime import timedelta 

In [2]: td = timedelta(hours=2) 

In [3]: str(td) 
Out[3]: '2:00:00' 

Was ich zu tun ist, möchte neu erstellen ein timedelta Objekt aus seiner String-Darstellung . Soweit ich das beurteilen kann, jedoch die datetime.parser.parse Methode wird immer wieder zurückkehrt ein datetime.datetime Objekt (vgl https://dateutil.readthedocs.io/en/stable/parser.html):

In [4]: import dateutil.parser 

In [5]: dateutil.parser.parse(str(td)) 
Out[5]: datetime.datetime(2016, 11, 25, 2, 0) 

Die einzige Art, wie ich jetzt sehe, dies zu tun ist, im Sprachgebrauch von Convert a timedelta to days, hours and minutes " Büste einige ekelerregend einfache (aber ausführliche) Mathematik heraus, um die Sekunden, Minuten, Stunden usw. zu erhalten, und gebe diese an die __init__ eines neuen timedelta zurück. Oder gibt es vielleicht einen einfacheren Weg?

Antwort

1

Das Modul pytimeparse, das von How to construct a timedelta object from a simple string inspiriert wurde, scheint das schwere Heben durch die Rückkehr der Anzahl der Sekunden zu tun. Ich habe nur ein Wrapper um sie, die ein timedelta Objekt mit der gleichen Anzahl von Sekunden zurück:

#!/usr/bin/env python3.5 
import datetime 
import pytimeparse 
import unittest 

def reconstruct_timedelta(td_string): 
    seconds = pytimeparse.parse(td_string) 
    return datetime.timedelta(seconds=seconds) 

class TestReconstruction(unittest.TestCase): 
    def test_reconstruct_timedelta_is_inverse_of_str(self): 
     td = datetime.timedelta(weeks=300, days=20, hours=3, minutes=4, milliseconds=254, microseconds=984) 
     td_reconstructed = reconstruct_timedelta(str(td)) 
     self.assertTrue(td == td_reconstructed) 

if __name__ == "__main__": 
    unittest.main() 

Wie Sie aus dem Test sehen können, das rekonstruierte timedelta Objekt ist das gleiche wie das Original, auch wenn es initialisiert mit einer beliebigen Nummer wenn milliseconds und microseconds.

0

Wie wäre es mit Essiggurken? Sie können sich auf https://docs.python.org/2/library/pickle.html beziehen. Serialisieren Sie das Zeitdelta-Objekt, und rufen Sie das Objekt später zurück.

import pickle 

tdi = pickle.dumps(td) 

tdo = pickle.loads(tdi) # will have the time delta object 

str(tdo) 
+0

Danke, aber ich würde lieber die Darstellung als eine für Menschen lesbare Zeichenfolge anstelle einer Sequenz von Bytes haben. –

1

Verwenden Sie datetime.strptime, um eine Zeichenfolge in Timedelta zu konvertieren.

import datetime 

td = datetime.timedelta(hours=2) 

# timedelta to string 
s = str(td) # 2:00:00 

# string to timedelta 
t = datetime.datetime.strptime(s,"%H:%M:%S") 
td2 = datetime.timedelta(hours=t.hour, minutes=t.minute, seconds=t.second) 
+0

Aus dem Quellcode für 'datetime' (der unter https://svn.python.org/projects/sandbox/trunk/datetime/datetime.py verfügbar zu sein scheint) würde es aus der Methodendefinition' __str__' erscheinen Es gibt einige spezielle Änderungen, wenn das "timedelta" Tage oder Mikrosekunden umfasst. Es sieht so aus, als ob Will Roberts, der Autor von [pytimeparse] (https://pypi.python.org/pypi/pytimeparse/1.1.5), (akribisch) alle diese Fälle behandelt hat. –

Verwandte Themen