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.
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.