Comparación entre fechahora y fechahora64[ns] en pandas

3 minutos de lectura

Avatar de usuario de JesusMonroe
JesúsMonroe

Estoy escribiendo un programa que verifica un archivo de Excel y si la fecha de hoy está en la columna de fecha del archivo de Excel, la analizo

Estoy usando:

cur_date = datetime.today()

para la fecha de hoy. Estoy comprobando si hoy está en la columna con:

bool_val = cur_date in df['date'] #evaluates to false

Sé con certeza que la fecha de hoy está en el archivo en cuestión. El tipo de serie es datetime64[ns]

Además, solo verifico la fecha en sí y no la marca de tiempo después, si eso importa. Estoy haciendo esto para hacer la marca de tiempo 00:00:00:

cur_date = datetime.strptime(cur_date.strftime('%Y_%m_%d'), '%Y_%m_%d')

Y el tipo de ese objeto después de la impresión también es fecha y hora.

Para cualquiera que también se topó con esto al comparar una fecha de marco de datos con una fecha variable, y esto no respondió exactamente a su pregunta; puedes usar el código de abajo.

En lugar de:

self.df["date"] = pd.to_datetime(self.df["date"])

Puede importar fecha y hora y luego agregar .dt.date al final como:

self.df["date"] = pd.to_datetime(self.df["date"]).dt.date

  • ¡Sí, esto lo resuelve! +1

    – mlcanales

    1 abr 2022 a las 19:01

  • Creo que en los pandas modernos solo necesitas .date cuando to_datetime devuelve una marca de tiempo

    – tommy

    30 de noviembre de 2022 a las 21:22

Avatar de usuario de piRSquared
piRScuadrado

Puedes usar

pd.Timestamp('today')

o

pd.to_datetime('today')

Pero ambos dan la fecha y la hora para 'now'.


Prueba esto en su lugar:

pd.Timestamp('today').floor('D')

o

pd.to_datetime('today').floor('D')

También podrías haber pasado el datetime oponerse a pandas.to_datetime pero me gusta la otra opcion mroe.

pd.to_datetime(datetime.datetime.today()).floor('D')

Pandas también tiene un Timedelta objeto

pd.Timestamp('now').floor('D') + pd.Timedelta(-3, unit="D")

O puedes usar el offsets módulo

pd.Timestamp('now').floor('D') + pd.offsets.Day(-3)

Para verificar la membresía, pruebe uno de estos

cur_date in df['date'].tolist()

O

df['date'].eq(cur_date).any()

  • ¿Qué sucede si estuve verificando 3 días antes de la fecha actual? Lo hice hoy = hoy – timedelta (3) cuando era un objeto de fecha y hora

    – Jesús Monroe

    13 de agosto de 2018 a las 16:58

  • pd.Timestamp('today').floor('D') - pd.offsets.Day(3)

    – piRSquared

    13 de agosto de 2018 a las 16:59

  • ¿Hay algún recurso sobre qué es exactamente to_datetime ¿Va a aceptar? ¿Se reduce simplemente a un caso de prueba y error/leer la fuente? Los documentos parecen decir “arg: integer, float, string, datetime, list, tuple, 1-d array, Series”, que es… un poco extenso.

    – Rogan Josh

    13 de agosto de 2018 a las 17:01

  • Eso lo resume todo. Por recurso, ¿te refieres a un documento que demuestre todo lo anterior?

    – piRSquared

    13 de agosto de 2018 a las 17:03

  • @piRSquared sí, tal vez esperaba demasiado, pero mi búsqueda no arrojó nada, así que lancé una última pregunta para ver si conocía un recurso específico.

    – Rogan Josh

    13 de agosto de 2018 a las 17:03

Avatar de usuario de JerryMcDonald.dev
JerryMcDonald.dev

Al convertir el tipo datetime64 usando pd.Timestamp() es importante tener en cuenta que debe compararlo con otro tipo de marca de tiempo. (no es un tipo datetime.date)


Convertir una fecha a numpy.datetime64

date="2022-11-20 00:00:00"
date64 = np.datetime64(date)

Hace siete días – tipo de marca de tiempo

sevenDaysAgoTs = (pd.to_datetime('today')-timedelta(days=7))

convertir date64 a Timestamp y ver si fue en los últimos 7 días

print(pd.Timestamp(pd.to_datetime(date64)) >= sevenDaysAgoTs)

  • Agregué esta respuesta porque en futuras versiones Timestamp y datetime.date se considerarán no comparables. FutureWarning: Comparison of Timestamp with datetime.date is deprecated in order to match the standard library behavior. In a future version these will be considered non-comparable.

    – JerryMcDonald.dev

    23 de noviembre de 2022 a las 20:20

¿Ha sido útil esta solución?