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?
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.
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
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)]
Si vos colonnes ne sont pas au format datetime. La syntaxe la plus courte serait: df.A = pd.to_datetime(df.A)
Que dis-tu de ça:
times['days_since'] = max(list(df.index.values))
times['days_since'] = times['days_since'] - times['months']
times