La función ISIN no funciona para fechas

d = {'Dates':[pd.Timestamp('2013-01-02'), pd.Timestamp('2013-01-03'), pd.Timestamp('2013-01-04')], 'Num1':[1,2,3], 'Num2':[-1,-2,-3]} df = DataFrame(data=d) 

Tenemos este dataframe

 Dates Num1 Num2 0 2013-01-02 00:00:00 1 -1 1 2013-01-03 00:00:00 2 -2 2 2013-01-04 00:00:00 3 -3 Dates datetime64[ns] Num1 int64 Num2 int64 dtype: object 

Esto me da

 df['Dates'].isin([pd.Timestamp('2013-01-04')]) 0 False 1 False 2 False Name: Dates, dtype: bool 

Estoy esperando un verdadero para la fecha “2013-01-04”, ¿qué me estoy perdiendo? Estoy usando la última versión 0.12 de Pandas

Tengo la misma versión de pandas, y la respuesta de @ DSM fue útil. Otra solución sería utilizar el método de aplicación:

 >>> df.Dates.apply(lambda date: date in [pd.Timestamp('2013-01-04')]) 0 False 1 False 2 True Name: Dates, dtype: bool 

Sí, eso me parece un error. Todo se reduce a esta parte de lib.ismember :

 for i in range(n): val = util.get_value_at(arr, i) if val in values: result[i] = 1 else: result[i] = 0 

val es un objeto numpy.datetime64 , y values es un set de objetos Timestamp . La membresía de prueba debería funcionar, pero no lo hace:

 >>> import pandas as pd, numpy as np >>> ts = pd.Timestamp('2013-01-04') >>> ts Timestamp('2013-01-04 00:00:00', tz=None) >>> dt64 = np.datetime64(ts) >>> dt64 numpy.datetime64('2013-01-03T19:00:00.000000-0500') >>> dt64 == ts True >>> dt64 in [ts] True >>> dt64 in {ts} False 

Creo que generalmente ese comportamiento, trabajar en una lista, no trabajar en un conjunto, se debe a que algo va mal con __hash__ :

 >>> hash(dt64) 1357257600000000 >>> hash(ts) -7276108168457487299 

No puede hacer la prueba de membresía en un conjunto si los hashes no son los mismos. Puedo pensar en algunas maneras de solucionar esto, pero elegir la mejor dependería de las elecciones de diseño que hicieran al implementar marcas de tiempo que no estoy calificado para comentar.

Esto funcionó para mí.

 df['Dates'].isin(np.array([pd.Timestamp('2013-01-04')]).astype('datetime64[ns]')) 

Sé que es un poco verboso. Pero en caso de que necesites hacer que funcione, esto ayudaría. Consulte https://github.com/pydata/pandas/issues/5021 para obtener más detalles.

¿Has intentado añadir las 00:00:00 después? Sería mejor si agregaras un artículo y algunas tags para que la gente obtenga más de tu pregunta y la syntax que estás usando.