Unterschied zwischen zwei Daten in Python


136

Ich habe zwei verschiedene Daten und möchte den Unterschied in Tagen zwischen ihnen wissen. Das Format des Datums ist JJJJ-MM-TT.

Ich habe eine Funktion, die eine bestimmte Nummer zu einem Datum hinzufügen oder subtrahieren kann:

def addonDays(a, x):
   ret = time.strftime("%Y-%m-%d",time.localtime(time.mktime(time.strptime(a,"%Y-%m-%d"))+x*3600*24+3600))      
   return ret

Dabei ist A das Datum und x die Anzahl der Tage, die ich hinzufügen möchte. Und das Ergebnis ist ein anderes Datum.

Ich benötige eine Funktion, bei der ich zwei Daten angeben kann und das Ergebnis ein int mit Datumsunterschied in Tagen ist.



Beachten Sie, dass Ihre AddonDays-Funktion an DST-Tagen fehlschlägt.
fishinear

Du hast recht. Ich habe die Funktion bereits geändert. Wenn Sie 3600 (eine Stunde) hinzufügen, funktioniert dies.
Mauguerra

Antworten:


270

Verwenden Sie -diese Option , um den Unterschied zwischen zwei datetimeObjekten zu ermitteln und das daysMitglied zu übernehmen.

from datetime import datetime

def days_between(d1, d2):
    d1 = datetime.strptime(d1, "%Y-%m-%d")
    d2 = datetime.strptime(d2, "%Y-%m-%d")
    return abs((d2 - d1).days)

37
Gute Antwort. Um klar zu sein, das Ergebnis von (d2 - d1)wird ein timedeltaObjekt sein.
Aganders3

Ich habe diesen Fehler auf der Konsole: Typ Objekt 'datetime.datetime' hat kein Attribut 'strptime'
mauguerra

2
Ich erhalte TypeError: Das Objekt 'int' kann nicht aufgerufen werden, wenn ich versuche, .days () für ein timedelta-Objekt auszuführen, und in der Dokumentation wird dies auch nicht erwähnt ( docs.python.org/2/library/datetime.html ).
user1761806

4
Könnten Sie bitte auch erwähnen total_seconds? Ich denke, es ist wichtig, da es das ist, was ich erwartet hatte, als ich es versuchte, secondsohne die Dokumente zu lesen.
Martin Thoma

1
@ThejKiran Lass d2 und d1 genau einen Tag auseinander sein und schau, ob es das ist, was du erwartest ;-)
Martin Thoma

27

Eine weitere kurze Lösung:

from datetime import date

def diff_dates(date1, date2):
    return abs(date2-date1).days

def main():
    d1 = date(2013,1,1)
    d2 = date(2013,9,13)
    result1 = diff_dates(d2, d1)
    print '{} days between {} and {}'.format(result1, d1, d2)
    print ("Happy programmer's day!")

main()

3
Ist das ifin der diff_datesFunktion nicht völlig unnötig? Nach der Definition des Absolutwertes abs(date1-date2)wird immer gleich sein abs(date2-date1).
Blckknght

Zumindest mit Python3.5 sollte die print-Anweisung folgendermaßen aussehen: print ('{} Tage zwischen {} und {}'. Format (Ergebnis1, d1, d2))
Ernestas Kardzys

2

Ich habe den von Larsmans oben geposteten Code ausprobiert, aber es gibt ein paar Probleme:

1) Der Code wie er ist löst den von mauguerra erwähnten Fehler aus. 2) Wenn Sie den Code wie folgt ändern:

...
    d1 = d1.strftime("%Y-%m-%d")
    d2 = d2.strftime("%Y-%m-%d")
    return abs((d2 - d1).days)

Dadurch werden Ihre datetime-Objekte in Zeichenfolgen konvertiert, jedoch zwei Dinge

1) Der Versuch, d2 - d1 auszuführen, schlägt fehl, da Sie den Minusoperator nicht für Zeichenfolgen verwenden können. 2) Wenn Sie die erste Zeile der oben angegebenen Antwort lesen, möchten Sie den Operator - für zwei Datums- / Uhrzeitobjekte verwenden, aber Sie nur konvertierte sie in Zeichenfolgen

Was ich gefunden habe ist, dass Sie buchstäblich nur Folgendes brauchen:

import datetime

end_date = datetime.datetime.utcnow()
start_date = end_date - datetime.timedelta(days=8)
difference_in_days = abs((end_date - start_date).days)

print difference_in_days

1
Mein Code datetime.strptimekonvertiert Zeichenfolgen in datetimeObjekte. Da das OP feststellte, dass "das Format des Datums JJJJ-MM-TT ist", nahm ich an, dass die Daten als Zeichenfolgen dargestellt wurden. Wenn dies nicht der Fall ist, ist offensichtlich keine Konvertierung erforderlich.
Fred Foo

0

Versuche dies:

data=pd.read_csv('C:\Users\Desktop\Data Exploration.csv')
data.head(5)
first=data['1st Gift']
last=data['Last Gift']
maxi=data['Largest Gift']
l_1=np.mean(first)-3*np.std(first)
u_1=np.mean(first)+3*np.std(first)


m=np.abs(data['1st Gift']-np.mean(data['1st Gift']))>3*np.std(data['1st Gift'])
pd.value_counts(m)
l=first[m]
data.loc[:,'1st Gift'][m==True]=np.mean(data['1st Gift'])+3*np.std(data['1st Gift'])
data['1st Gift'].head()




m=np.abs(data['Last Gift']-np.mean(data['Last Gift']))>3*np.std(data['Last Gift'])
pd.value_counts(m)
l=last[m]
data.loc[:,'Last Gift'][m==True]=np.mean(data['Last Gift'])+3*np.std(data['Last Gift'])
data['Last Gift'].head()

-4

pd.date_range ('2019-01-01', '2019-02-01'). shape [0]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.