2016-07-13 20 views
1

Ich habe ein Pandas-Datenframe mit zwei Spalten, eine Datumsspalte und eine int-Spalte, und ich möchte einfach die int-Spalte (in Tagen) zur Datumsspalte hinzufügen . Ich habe eine Lösung gefunden, die df.apply() verwendet, aber das war zu langsam in meinem vollständigen Dataset. Ich sehe nicht eine Menge Dokumentation dafür, dies vektorisiert zu tun (das nächste, was ich finden konnte, war this), also wollte ich sicherstellen, dass die Lösung, die ich fand, der beste Weg war, weiter zu gehen.Pandas: add timedelta spalte to datetime spalte (vektorisiert)

Meine Rohdaten sind nur eine Spalte von Strings als eine Spalte von Ints (Tage).

import pandas as pd 
from datetime import timedelta 

df = pd.DataFrame([['2016-01-10',28],['2016-05-11',28],['2016-02-23',15],['2015-12-08',30]], 
        columns = ['ship_string','days_supply']) 
print df 

ship_string days_supply 
0 2016-01-10   28 
1 2016-05-11   28 
2 2016-02-23   15 
3 2015-12-08   30 

Mein erster Gedanke (das war) war .apply wie folgt zu verwenden:

def f(x):  
    return x['ship_date'] + timedelta(days=x['days_supply']) 

df['ship_date'] = pd.to_datetime(df['ship_string']) 

df['supply_ended'] = df.apply(f,axis = 1) 

Das funktionierte, aber es ist sehr langsam. Ich habe meine alternative Lösung unten als Antwort auf die Frage gepostet, aber ich möchte eine Bestätigung erhalten, dass es sich um "best practice" handelt. Ich konnte nicht viele gute Threads zum Hinzufügen von timedelta Spalten zu Dates in Pandas finden (besonders auf vektorisierte Weise), also dachte ich, ich würde etwas hinzufügen, das ein bisschen benutzerfreundlicher ist und hoffentlich wird es der nächsten armen Seele helfen, es zu versuchen mach das.

Antwort

3

Voll Code Lösung:

import pandas as pd 
from datetime import timedelta 

df = pd.DataFrame([['2016-01-10',28],['2016-05-11',28],['2016-02-23',15],['2015-12-08',30]], 
         columns = ['ship_string','days_supply']) 

df['ship_date'] = pd.to_datetime(df['ship_string']) 

df['time_added'] = pd.to_timedelta(df['days_supply'],'d') 
df['supply_ended'] = df['ship_date'] + df['time_added'] 

print df 

    ship_string days_supply ship_date time_added supply_ended 
0 2016-01-10   28 2016-01-10  28 days 2016-02-07 
1 2016-05-11   28 2016-05-11  28 days 2016-06-08 
2 2016-02-23   15 2016-02-23  15 days 2016-03-09 
3 2015-12-08   30 2015-12-08  30 days 2016-01-07 

Bitte lassen Sie mich in den Kommentaren unten wissen, ob dies nicht eine gute vektorisiert Lösung ist, und ich werde bearbeiten.

+0

Es ist eine gute Lösung, vielleicht ist eine Zeile besser 'df ['supply_ended'] = pd.to_datetime (df ['ship_string']) + pd.to_timedelta (df ['days_supply'], 'd')', wenn neue Spalten erstellen nicht notwendig ist. – jezrael

+0

Ich konnte die Funktion 'pd.to_timedelta' nicht finden, da 'DateOffset' nicht mit Series funktionieren würde, also vielen Dank, dass Sie diese Lösung gepostet haben! – FlorianGD