2016-05-23 18 views
2

Der StringZiemlich Formatierung von langen String

date2check = to_datetime(str(last_tx.year) + \ 
         '-' + str(int(last_tx.month)-3) + \ 
         '-' + str(last_tx.day) + \ 
         ' ' + str(last_tx.hour) + \ 
         ':' + str(last_tx.minute) + \ 
         ':' + str(last_tx.second)) 

Werke ohne Problem, aber ich möchte wissen, ob es eine Möglichkeit ist, neu zu schreiben dies sachgemässer (in einem pythonic Weg). last_tx ist ein Datetime-Objekt.

+1

[Hier ist ein ähnlicher Beitrag] (http://stackoverflow.com/questions/4172448/is-it-possible-to-break-a-long-line-to-multiple-lines-in-python#4172465) das sollte helfen. Im Wesentlichen können Sie Zeilenumbrüche mit einem Backslash umgehen. –

Antwort

2

Ein pythonic Weg ist dateutil.relativedelta (deklarieren 3 Monate) zu verwenden und datetime.strftime (Format Datetime). Hier ist ein MWE.

from datetime import datetime 
from dateutil.relativedelta import relativedelta 

three_months = relativedelta(months=3) 
dt = datetime.now() - three_months # replace `datetime.now()` with `last_tx` 

s = dt.strftime('%Y-%m-%d %H:%M:%S') 

print(s) 
# Output 
2016-02-23 20:37:19 

vorherige Antwort, Verwenden str.join,

s1 = '-'.join([str(i) for i in [last_tx.year, last_tx.month-3, last_tx.day]) 
s2 = ':'.join([str(i) for i in [last_tx.hour, last_tx.minute, last_tx.second]) 

date2check = to_datetime(' ',join([s1, s2])) 
+0

Ich bekomme nur zwei Monate Unterschied »2016-05-23 14:27:27 2016-03-23 ​​14:27:27 2016-05-22 21:20:08 2016-03-22 21:20 : 08 2016-05-23 13:40:20 2016-03-23 ​​13: 40: 20 "Weißt du warum? –

+0

@JuanDavid, ersetzen Sie das Argument 'Monat' (absolute Information) durch 'Monate' (relative Information). – SparkAndShine

3

A pythonic Weg datetime Modul zu erhalten, um das Datum von 3 Motte vor verwendet:

datetime.strftime(last_tx-timedelta(90),'%Y-%m-%d %H:%M:%S') 

Hier ein Beispiel:

>>> from datetime import datetime, timedelta 
>>> datetime.now() 
datetime.datetime(2016, 5, 23, 23, 3, 34, 588744) 
>>> datetime.strftime(datetime.now()-timedelta(90),'%Y-%m-%d %H:%M:%S') 
'2016-03-24 23:03:38' 

Wie @farkandshine im Kommentar erwähnt, da 90 nicht immer 3 Monate darstellt, können Sie dateutil.relativedelta verwenden, um eine genaue Übereinstimmung zu erreichen.

+1

90 Tage ('timedelta (90)') sind nicht immer äquivalent zu 3 Monaten. Ist es besser, relativedelta (Monat = 3) zu verwenden? – SparkAndShine

+1

@sparkandshine In der Tat, danke für Note;) – Kasramvd

+1

Danke, mich in Ihrer Antwort zu erwähnen. Du hast meinen Preis verdient :-) – SparkAndShine