Tengo poco más de 300.000 filas en una hoja de cálculo y cada una de estas filas contiene una marca de tiempo (HH:MM:SS AM) y una fecha (DD/MM/AAAA).
Me gustaría obtener recuentos de estas marcas de tiempo y agruparlas en períodos de 5 minutos, por día de la semana (es decir, me gustaría saber el número de marcas de tiempo entre las 12:00 a. m. y las 12:05 a. m. del domingo, 12:05 y 12:10 a. m. el domingo, etc.). Siento que tengo que usarlo COUNTIF
de alguna manera, pero no sé exactamente cómo implementarlo. Estoy tratando de organizar los resultados en otra hoja, que se parece a esta.
El recuento de cada período de 5 minutos iría en la columna del medio, debajo del día de la semana (así que ahí es donde ingresaría la fórmula).
Gracias de antemano por cualquier ayuda, ¡realmente lo agradezco!
EDITAR: Probablemente debería haber incluido que mis datos se ven así:
Respuesta1
Puede agregar un par de campos a sus datos y luego generar una tabla dinámica para obtener los recuentos.
Primero, agregue un DOW
campo Día de la semana ( ). Para obtenerlo, DOW
utilice la siguiente fórmula, donde la columna B
contiene la fecha.
=CHOOSE(WEEKDAY(B2,1),"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
A continuación, agregue un campo para representar el período de 5 minutos en el que se encuentra la marca de tiempo Time Range
. Utilice la siguiente fórmula para calcular esto, donde la marca de tiempo está en la columna A
.
=TIME(HOUR(A2),ROUNDDOWN(MINUTE(A2)/5,0)*5,0)
Una vez que haya agregado estas columnas a sus datos, cree una tabla dinámica que utilice todos sus datos como fuente de datos.
Configure su tabla dinámica con DOW
etiquetas de columna y Time Range
etiquetas de fila. Establezca los valores en Count of Time Range
.
Nota: Esta muestra parece un poco rara porque utilicé datos escasos (20 registros en una semana) para generar la tabla dinámica. Debería parecerse más a lo que tiene en mente con su gran conjunto de datos.
Respuesta2
De manera similar a lo que recomendó @Excellll, puede agregar una columna adicional que especifique el día de la semana, es decir, en la hoja 1, donde están presentes sus datos sin procesar y las columnas A y B contienen la fecha y hora respectivamente, puede usar esta función en la columna C.
=SI(O(ESTÁ EN BLANCO(A1),ESTÁ EN BLANCO(B1)),"",DÍA DE LA SEMANA(A1))
El enfoque que estoy usando se basa exclusivamente en funciones. Al igual que la imagen que compartiste, personalicé fórmulas para la Hoja 2 para generar una estructura similar. La siguiente condición verifica que existan marcas de tiempo en un rango particular como se declara en la primera columna de la tabla y, además, que sea un día determinado de la semana. Luego cuenta todos esos valores.
=CONTAR.SI(Hoja1!$B:$B, ">"&$A3,Hoja1!$B:$B,"<="&$A4,Hoja1!$C:$C,"="&B$2)
La imagen muestra cómo se ingresa la fórmula anterior en la celda B1 y tiene condiciones para verificar que la hora esté en el rango de 12:00 a. m. a 0:10 a. m. y el día esté configurado en domingo o 1.
Como habrás notado, la diferencia horaria aquí es de 10 minutos, la he hecho personalizable, para que puedas configurarla en 5 minutos o 2 horas según tus necesidades.
Dado que aquí usamos funciones, no importa si sus datos tienen 4 filas vacías o 10 filas vacías en el medio. Las funciones garantizan que solo se recopilen datos que no estén en blanco. No tenía suficientes datos, por lo que el ejemplo parece bastante vacío. Encuentre los xls de muestra adjuntos.aquí.
Respuesta3
Nota: vamos a solucionar el problema de este código esta noche, todavía tengo algunos errores al bajar en la lista de valores. Actualmente no funciona, simplemente no quiero reformatear mis líneas de código. Siéntete libre de jugar. Agregaré comentarios e instrucciones al mismo tiempo.
Alguien mencionó que esto se podría hacer con VBA. Me gusta VBA, así que le di un golpe.
Un par de suposiciones:
1 - La marca de tiempo y la fecha no están contenidas en la misma celda (es decir, 12:00:00 a. m. | 21/07/2014 NO 21/07/2014 00:00:00)
2: desea que todos los recuentos de marcas de tiempo se agrupen en una única lista de días (es decir, mostrar solo un conjunto de domingo a sábado y no crear un nuevo conjunto de columnas para cada día adicional; si comenzamos en viernes, no comenzaríamos la agrupación el viernes, y si terminamos un martes dos semanas después, no tendríamos 16 columnas de agrupaciones)
3 - No hay celdas nulas en sus datos desde la primera fila hasta la última.
4 - Tus datos de marcas de tiempo y fechas tienen encabezados
Debe presionar alt+f11, abrir el libro de trabajo donde tiene los datos y las hojas de trabajo de origen e ingresar este código. Entonces presione F5.
Public Sub PrintDateGroups()
Dim icontrol As Integer
Dim iweeknum As Integer
Dim ipasscount As Integer
Dim lngwalktimevalues As Long
Dim ipasstimecount As Integer
icontrol = 1
Do Until icontrol = -1:
If ThisWorkbook.Sheets("Data").Cells(icontrol,2).Value = "" Then
icontrol = -1
Else
icontrol = icontrol + 1
iweeknum = Weekday(ThisWorkbook.Sheets("Data").Cells(icontrol, 1).Value, vbSunday)
For lngwalktimevalues = 0 To 99999999 Step 694444.4375
If (TimeValue(Format(ThisWorkbook.Sheets("Data").Cells(icontrol, 2).Value, "hh:mm:ss")) * 100000000) <= lngwalktimevalues Then
If iweeknum = 1 Then
If ThisWorkbook.Sheets("Destination").Cells(Round((lngwalktimevalues / 694444.4375) + 1, 0), 2).Value <> "" Then
ThisWorkbook.Sheets("Destination").Cells(Round((lngwalktimevalues / 694444.4375) + 1, 0), 2).Value = ThisWorkbook.Sheets("Destination").Cells(lngwalktimevalues / 694444.4375, 2).Value + 1
Exit For
Else
ThisWorkbook.Sheets("Destination").Cells(Round((lngwalktimevalues / 694444.4375) + 1, 0), 2).Value = 1
Exit For
End If
Else
If ThisWorkbook.Sheets("Destination").Cells((lngwalktimevalues / 694444.4375) + 1, ((3 * iweeknum) + (iweeknum - 2))).Value = "" Then
ThisWorkbook.Sheets("Destination").Cells((lngwalktimevalues / 694444.4375) + 1, ((3 * iweeknum) + (iweeknum - 2))).Value = 1
Exit For
Else
ThisWorkbook.Sheets("Destination").Cells((lngwalktimevalues / 694444.4375) + 1, ((3 * iweeknum) + (iweeknum - 2))).Value = ThisWorkbook.Sheets("Destination").Cells(lngwalktimevalues / 694444.4375, ((3 * iweeknum) + (iweeknum - 2))).Value + 1
Exit For
End If
End If
End If
Next lngwalktimevalues
End If
Loop
End Sub
Respuesta4
Debería poder redondear cada registro a los cinco minutos más cercanos. Luego use la función subtotal de Excel para obtener los recuentos.
Haría el redondeo creando una nueva columna de la fecha (=Día(A1)) y una segunda columna de la marca de tiempo.