web-dev-qa-db-fra.com

Ajouter une colonne avec le nombre de jours entre les dates dans DataFrame pandas

Je veux soustraire des dates dans 'A' à des dates dans 'B' et ajouter une nouvelle colonne avec la différence.

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

J'ai essayé ce qui suit, mais j'ai une erreur quand j'essaie d'inclure ceci dans une boucle for ...

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

Que devrais-je faire?

65
Jase Villam

En supposant qu'il s'agisse de colonnes datetime (si elles ne s'appliquent pas to_datetime) vous pouvez simplement les soustraire:

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

Remarque: assurez-vous que vous utilisez un nouveau de pandas (par exemple, 0.13.1), cela pourrait ne pas fonctionner dans les versions antérieures.

71
Andy Hayden

Pour supprimer l'élément de texte 'days', vous pouvez également utiliser l'accesseur dt () pour la série: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt .html

Alors,

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

df['C'] = (df['B'] - df['A']).dt.days

qui retourne:

             A          B   C
one 2014-01-01 2014-02-03  33
two 2014-02-03 2014-03-01  26
69
Blodwyn Pig

Une compréhension de liste est votre meilleur choix pour le moyen le plus rapide (et le plus rapide) de faire cela:

[int(i.days) for i in (df.B - df.A)]
  1. je vais retourner le timedelta (par exemple, "-58 jours")
  2. i.days renverra cette valeur sous forme de nombre entier long (par exemple -58L)
  3. int (i.days) vous donnera le -58 que vous cherchez.

Si vos colonnes ne sont pas au format datetime. La syntaxe la plus courte serait: df.A = pd.to_datetime(df.A)

10
A.Kot

Que dis-tu de ça:

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