Agregue una columna con el número de días entre las fechas en los pandas DataFrame

Quiero restar las fechas en ‘A’ de las fechas en ‘B’ y agregar una nueva columna con la diferencia.

df AB one 2014-01-01 2014-02-28 two 2014-02-03 2014-03-01 

He intentado lo siguiente, pero aparece un error cuando bash incluir esto en un bucle 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 

¿Qué tengo que hacer?

Suponiendo que estas fueran columnas de fecha y hora (si no se aplican a to_datetime ), simplemente puede to_datetime :

 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]: ABC one 2014-01-01 2014-02-28 -58 days two 2014-02-03 2014-03-01 -26 days 

Nota: asegúrese de que está utilizando una nueva versión de pandas (por ejemplo, 0.13.1), esto puede no funcionar en versiones anteriores.

Para eliminar el elemento de texto “días”, también puede utilizar el elemento de acceso dt () para la serie: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.html

Asi que,

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

Que devuelve

  ABC one 2014-01-01 2014-02-03 33 two 2014-02-03 2014-03-01 26 

Una lista de comprensión es su mejor apuesta para la forma más Pythonic (y más rápida) de hacer esto:

 [int(i.days) for i in (df.B - df.A)] 
  1. devolveré el timedelta (por ejemplo, ‘-58 días’)
  2. i.days devolverá este valor como un valor entero largo (por ejemplo, -58L)
  3. int (i.days) te dará el -58 que buscas.

Si sus columnas no están en formato de fecha y hora. La syntax más corta sería: df.A = pd.to_datetime(df.A)

Qué tal esto:

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