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