web-dev-qa-db-fra.com

Pandas: ajouter la colonne timedelta à la colonne datetime (vectorisée)

J'ai un pandas dataframe avec deux colonnes, une colonne de date et une colonne int, et je voudrais simplement ajouter la colonne int (en jours) à la colonne de date. J'ai trouvé une solution en utilisant df.apply (), mais c'était trop lent sur mon jeu de données complet. Je ne vois pas une tonne de documentation sur la façon de le faire de manière vectorisée (le plus proche que j'ai pu trouver était this ), donc je voulais m'assurer que la solution que je trouvais était la meilleure façon d'aller de l'avant.

Mes données brutes ne sont qu'une colonne de chaînes comme une colonne d'entiers (jours).

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

Ma première pensée (qui a fonctionné) a été d'utiliser .apply comme suit:

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)

Cela a fonctionné, mais est extrêmement lent. J'ai posté ma solution alternative ci-dessous comme réponse à la question, mais j'aimerais obtenir la confirmation qu'il s'agit de la "meilleure pratique". Je n'ai pas pu trouver beaucoup de bonnes discussions sur l'ajout de colonnes timedelta aux dates dans pandas (en particulier de manière vectorisée), alors j'ai pensé en ajouter une qui est un peu plus conviviale et j'espère cela aidera la prochaine âme pauvre à essayer de le faire.

14
flyingmeatball

Solution de code complet:

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

Veuillez me faire savoir dans les commentaires ci-dessous si ce n'est pas une bonne solution vectorisée et je vais éditer.

24
flyingmeatball