Me acabo de dar cuenta de un "comportamiento diferente" de la función .loc al acceder a los marcos de datos con diferentes formatos datetimeindex.

Dado el 2 dataframes a continuación:

df1
datetimeindex  value
2020-10-01     50.1
2020-10-02     50.2
2020-10-03     50.3
2020-10-04     50.4
2020-10-05     50.5
2020-10-06     50.6
2020-10-07     50.7


df2
datetimeindex            value
2020-10-01 09:45:07      50.1
2020-10-02 09:45:07      50.2
2020-10-03 09:45:07      50.3
2020-10-04 09:45:07      50.4
2020-10-05 09:45:07      50.5
2020-10-06 09:45:07      50.6
2020-10-07 09:45:07      50.7
2020-10-08 09:45:07      50.8

Si ahora aplico la función .loc con la misma entrada exacta, obtengo resultados diferentes.

sdate = date(2020, 10, 1)
edate = date(2020, 10, 5)

df1.loc[sdate:edate]
datetimeindex  value
2020-10-01     50.1
2020-10-02     50.2
2020-10-03     50.3
2020-10-04     50.4
2020-10-05     50.5

df2.loc[sdate:edate]
df2
datetimeindex            value
2020-10-01 09:45:07      50.1
2020-10-02 09:45:07      50.2
2020-10-03 09:45:07      50.3
2020-10-04 09:45:07      50.4

Creo que este comportamiento se debe a que date(2020, 10, 5) se manejará como 2020-10-05 00:00:00 y por eso la línea 2020-10-05 de df2 parece estar excluida.

Actualmente me estoy ayudando a mí mismo usando timedelta para df2. Así que accedo a df2 con df2.loc[sdate:(edate + timedelta(days=1))].

Me pregunto si hay una forma más elegante de compensar este comportamiento o si estoy completamente equivocado de todos modos.

¡Gracias!

0
snky1337 13 mar. 2021 a las 13:55

1 respuesta

La mejor respuesta

Tiene razón sobre este comportamiento de fecha y hora. Puede resolver esto usando {{X0} } en df2:

df2.index = df2.index.round('D')
0
RJ Adriaansen 13 mar. 2021 a las 14:04