2014-03-02 7 views
35

Ich möchte Daten in 'A' von Daten in 'B' subtrahieren und eine neue Spalte mit dem Unterschied hinzufügen.Add Spalte mit der Anzahl der Tage zwischen Daten in DataFrame Pandas

df 
      A  B 
one 2014-01-01 2014-02-28 
two 2014-02-03 2014-03-01 

ich folgende versucht haben, aber einen Fehler, wenn ich versuche, dies für Schleife in einem schließen ...

import datetime 
date1=df['A'][0] 
date2=df['B'][0] 
mdate1 = datetime.datetime.strptime(date1, "%Y-%m-%d").date() 
rdate1 = datetime.datetime.strptime(date2, "%Y-%m-%d").date() 
delta = (mdate1 - rdate1).days 
print delta 

Was soll ich tun?

Antwort

43

Unter der Annahme, diese Datums-Werte waren (wenn sie nicht anwenden to_datetime) Sie können sie nur subtrahieren:

df['A'] = pd.to_datetime(df['A']) 
df['B'] = pd.to_datetime(df['B']) 

In [11]: df.dtypes # if already datetime64 you don't need to use to_datetime 
Out[11]: 
A datetime64[ns] 
B datetime64[ns] 
dtype: object 

In [12]: df['A'] - df['B'] 
Out[12]: 
one -58 days 
two -26 days 
dtype: timedelta64[ns] 

In [13]: df['C'] = df['A'] - df['B'] 

In [14]: df 
Out[14]: 
      A   B  C 
one 2014-01-01 2014-02-28 -58 days 
two 2014-02-03 2014-03-01 -26 days 

Hinweis: sicherzustellen, dass Sie mit einer neuen Pandas (zB 0.13.1), Dies funktioniert möglicherweise nicht in älteren Versionen.

+9

Können wir den Teil "Tage" im Ergebnis loswerden, wenn wir nur den numerischen Wert sehen müssen, dh. -58, -26 in diesem Fall. – 0nir

+3

auf @AndyHayden Kommentar zu erweitern, das funktioniert aber es sollte 'pd.offsets.Day (1)' (mit einem 's'). Ich negiere es auch normalerweise, also bekommst du '(df ['A'] - df ['B'])/pd.offsets.Day (-1)' – dirkjot

+6

Allerdings, wenn du das auf einer ganzen Serie machen willst brauche '(df ['A'] - df ['B'])/np.timedelta64 (-1, 'D')' aus Gründen, die ich nicht vollständig verstehe. – dirkjot

8

Eine Liste Verständnis ist die beste Wahl für die meisten Pythonic (und schnellsten) Weg, dies zu tun:

[int(i.days) for i in (df.B - df.A)] 
  1. ich das Timedelta zurück (zB '-58 Tage)
  2. i.days gibt diesen Wert als langen Ganzzahlwert zurück (zB -58L)
  3. int (i.days) gibt Ihnen die -58, die Sie suchen.

Wenn Ihre Spalten nicht im Datetime-Format vorliegen. Die kürzere Syntax wäre: df.A = pd.to_datetime(df.A)

1

Wie wäre es damit:

times['days_since'] = max(list(df.index.values)) 
times['days_since'] = times['days_since'] - times['months'] 
times 
Verwandte Themen