Python: compara dos fechas ignorando el valor de los segundos en el marco de datos de pandas

CorePress2024-01-24  10

Aquí está el marco de datos 1.

index                 date  Count
4      2021-01-08 07:52:18   1
3      2021-01-08 08:53:34   10
0      2021-01-09 07:56:54   12
5      2021-01-09 09:52:17   13
1      2021-01-12 07:55:58   5

Aquí está el marco de datos 2

date                  Count
2021-01-08 07:52:00    0
2021-01-08 07:53:00    0
2021-01-08 07:54:00    0
2021-01-08 07:55:00    0
2021-01-08 07:56:00    0
...                    ...
2021-01-14 08:45:00    0
2021-01-14 08:46:00    0
2021-01-14 08:47:00    0
2021-01-14 08:48:00    0
2021-01-14 08:49:00    0

[8698 rows x 1 columns]

Necesito colocar los valores de recuento del primer marco de datos en el recuento del segundo marco de datos. Lea los valores del datagrama uno y busque en el datagrama 2. Si lo encuentra, reemplace el valor de recuento.

pero el problema son los "segundos" valor en el primer marco de datos. ¿Hay alguna forma de ignorarlo al comparar? (Puedo hacer lógica, pero necesito alguna forma rápida, tal vez una función integrada en Python o Pandas)

¿Solo quieres comparar los valores de horas y minutos?

– Porwal maya

27 de marzo de 2021 a las 7:34

si convierte ambos a strftime('%Y%m%d %H:%M') y los combina, debería poder obtener lo que desea. ¿No es así?

- Joe Ferndz

27 de marzo de 2021 a las 7:40

@MayankPorwal fecha, hora, minuto

- Adnan Ali

27 de marzo de 2021 a las 7:42

1

Piso la fecha en df y luego comparar/fusionar/mapear: df['date'].dt.floor('T') ? Pruebe df2['fecha'].map(dict(zip(df1['fecha'].dt.floor('T'),df1[' ;Contar']))).fillna(df2['Contar'])

- anky

27 de marzo de 2021 a las 7:43

@JoeFerndz sípodría ser una opción. pero no es así, la memoria será costosa. En caso de que tenga datos de 30 días. Supongo que serán millones de registros.

- Adnan Ali

27 de marzo de 2021 a las 7:43



------------------------------------

Como sugirió @anky, puedes fijar la fecha en df ya que se trata de un marco de datos más pequeño. Luego fusiona los datos.

import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
                            '2021-01-09 07:56:54','2021-01-09 09:52:17',
                            '2021-01-12 07:55:58'],
                    'count':[1,10,12,13,5]})
df2 = pd.DataFrame({'date':pd.date_range('2021-01-08 07:52:00',periods=9000,freq='T'),
                    'count':[0]*9000})

print (df2)

df1['date'] = pd.to_datetime(df1['date'])
df1['date_str'] = df1['date'].dt.floor('T')

df2 = df2.merge(df1[['date_str','count']],left_on='date',right_on='date_str', how='left')

df2.drop(columns=['date_str','count_x'],inplace=True)
df2.rename(columns={'count_y':'count'},inplace=True)
print (df2)

El resultado de esto será:

df1:

                 date  count            date_str
0 2021-01-08 07:52:18      1 2021-01-08 07:52:00
1 2021-01-08 08:53:34     10 2021-01-08 08:53:00
2 2021-01-09 07:56:54     12 2021-01-09 07:56:00
3 2021-01-09 09:52:17     13 2021-01-09 09:52:00
4 2021-01-12 07:55:58      5 2021-01-12 07:55:00

df2: después de fusionarse con df1

                    date  count
0    2021-01-08 07:52:00    1.0
1    2021-01-08 07:53:00    NaN
2    2021-01-08 07:54:00    NaN
3    2021-01-08 07:55:00    NaN
4    2021-01-08 07:56:00    NaN
...                  ...    ...
8995 2021-01-14 13:47:00    NaN
8996 2021-01-14 13:48:00    NaN
8997 2021-01-14 13:49:00    NaN
8998 2021-01-14 13:50:00    NaN
8999 2021-01-14 13:51:00    NaN



------------------------------------

Si ejecutas df1 con remuestreo en minutos, aumentará el muestreo desde la fecha y hora mínimas hasta la fecha y hora máximas. Si lo vuelve a indexar según el índice de df2, obtendrá el resultado deseado. Tomé prestado parte del código para crear los datos de @Joe Ferndz

import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
                            '2021-01-09 07:56:54','2021-01-09 09:52:17',
                            '2021-01-12 07:55:58'],
                    'count':[1,10,12,13,5]})
df1['date'] = pd.to_datetime(df1['date'])
df1.set_index('date', inplace=True)
df1 = df1.resample('min').sum()

d_range = pd.date_range('2021-01-08 07:52:00', '2021-01-14 08:49:00', freq='1min')
df2 = pd.DataFrame(index=d_range)

df1 = df1.reindex(df2.index, fill_value=0)
df1

    count
2021-01-08 07:52:00     1
2021-01-08 07:53:00     0
2021-01-08 07:54:00     0
2021-01-08 07:55:00     0
2021-01-08 07:56:00     0
...     ...
2021-01-14 08:45:00     0
2021-01-14 08:46:00     0
2021-01-14 08:47:00     0
2021-01-14 08:48:00     0
2021-01-14 08:49:00     0

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare