Estoy usando Python 3.7.12 y trato de comprender el comportamiento de agregar un objeto pandas.TimedeltaIndex a un objeto datetime.date , y específicamente por qué a veces obtengo un TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date' Error TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date' . Extraigo datos de una fuente y los cargo en un marco de datos con una o más filas, y trato de agregar una nueva columna a todas las filas que contienen la suma de datetime.date y pandas.TimedeltaIndex para esa fila. Mi código funciona siempre que haya al menos dos filas en el marco de datos, por ejemplo
import pandas as pd import logging logging.basicConfig(level=logging.DEBUG) data = {'dates': [pd.to_datetime('2017-04-27 15:59:59', format='%Y-%m-%d %H:%M:%S'), pd.to_datetime('2017-04-28 15:59:59', format='%Y-%m-%d %H:%M:%S')], 'deltas': ['90', '180']} df = pd.DataFrame(data) df['adjusted_dates'] = df['dates'].dt.date + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D') # The deltas have been applied and df is in the expected shape logging.debug("Job done")Sin embargo, si tengo exactamente una fila en mi marco de datos, aparece el error:
import pandas as pd import logging logging.basicConfig(level=logging.DEBUG) data = {'dates': [pd.to_datetime('2017-04-27 15:59:59', format='%Y-%m-%d %H:%M:%S')], 'deltas': ['90']} df = pd.DataFrame(data) # TypeError: unsupported operand type(s) for +: 'TimedeltaArray' and 'datetime.date' df['adjusted_dates'] = df['dates'].dt.date + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D') # We don't get this far logging.debug("Job done")¿Por qué veo este error para marcos de datos de una sola fila? Cualquier ayuda sería muy apreciada.
EDITAR: Encontré otra pregunta aquí en Stack Overflow que responde por qué mi código a veces falla: Python Pandas: TypeError: tipos de operandos no admitidos para +: 'datetime.time' y 'Timedelta'
Estaba intentando agregar un objeto delta de Pandas a una fecha y datetime de Python, pero estas dos pilas son incompatibles. Cuando tengo objetos Pandas para ambos operandos, el marco de datos se actualiza como se esperaba para marcos de datos de una sola fila y de varias filas.
df['adjusted_dates'] = df['dates'] + pd.TimedeltaIndex(df['deltas'].astype('int64'), unit='D')Ahora que veo por qué mi código no siempre tuvo éxito, estoy confundido en cuanto a por qué no siempre falló.
Puedes simplificar a
import pandas as pd df = pd.DataFrame({'dates': ['2017-04-27 15:59:59', '2017-04-28 15:59:59'], 'deltas': ['90', '180']}) # no need to provide a format, no need to use an index: df['adjusted_dates'] = (pd.to_datetime(df['dates']) + pd.to_timedelta(df['deltas'].astype(int), unit='D')) # df['adjusted_dates'] # 0 2017-07-26 15:59:59 # 1 2017-10-25 15:59:59 # Name: adjusted_dates, dtype: datetime64[ns]O, si solo desea agregar el timedelta a la fecha , ignorando la hora:
df['adjusted_dates'] = (pd.to_datetime(df['dates']).dt.floor('D') + pd.to_timedelta(df['deltas'].astype(int), unit='D')) # df['adjusted_dates'] # 0 2017-07-26 # 1 2017-10-25 # Name: adjusted_dates, dtype: datetime64[ns] Tenga en cuenta que en ambos casos, tendrá el tipo de datos datetime64[ns] . Si baja al día, la hora simplemente no se muestra (el valor predeterminado es cero / 00:00:00).