答案1
您可以向数据添加几个字段,然后生成数据透视表来获取计数。
首先,添加“星期几”(DOW
)字段。使用DOW
以下公式,其中列B
包含日期。
=CHOOSE(WEEKDAY(B2,1),"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday")
接下来,添加一个字段来表示时间戳所在的 5 分钟时间段。Time Range
使用以下公式计算该字段,其中时间戳位于 列中A
。
=TIME(HOUR(A2),ROUNDDOWN(MINUTE(A2)/5,0)*5,0)
将这些列添加到数据后,创建一个使用所有数据作为数据源的数据透视表。
设置数据透视表,将其设置DOW
为列标签和Time Range
行标签。将值设置为Count of Time Range
。
注意:此示例看起来有点奇怪,因为我使用稀疏数据(一周 20 条记录)来生成数据透视表。它应该看起来更像您在处理大型数据集时所想的那样。
答案2
与 @Excellll 推荐的类似,您可以添加一个额外的列来指定星期几,即在工作表 1 中,其中存在原始数据,A 列和 B 列分别包含日期和时间,您可以在 C 列中使用此函数
=IF(OR(ISBLANK(A1),ISBLANK(B1)),"",WEEKDAY(A1))
我使用的方法完全基于函数。就像您分享的图片一样,我为 Sheet 2 自定义了公式以生成类似的结构。以下条件检查时间戳是否存在于表格第一列中声明的特定范围内,以及它是否是给定的星期几。然后它会计算所有这些值。
=COUNTIFS(Sheet1!$B:$B,">"&$A3,Sheet1!$B:$B,"<="&$A4,Sheet1!$C:$C,"="&B$2)
该图显示了如何在单元格 B1 中输入上述公式,并检查条件是否在 12:00 AM 至 12:10 AM 范围内,日期是否设置为星期日或 1。
您可能已经注意到这里的时差是 10 分钟,我已将其设置为可自定义,因此您可以根据需要将其设置为 5 分钟或 2 小时。
由于我们在这里使用函数,因此您的数据中间是否有 4 个空行或 10 个空行并不重要。这些函数确保只收集非空白数据。我没有足够的数据,所以示例看起来很空。请查看附件中的示例 xls这里。
答案3
注意 - 今天晚上要排除此代码故障,在值列表中向下移动时仍有一些错误。目前不可行,只是不想重新格式化我的代码行。请随意尝试。我会同时添加注释和说明。
有人提到可以使用 VBA 来实现这一点。我喜欢 VBA,所以我尝试了一下。
一些假设:
1 - 时间戳和日期不包含在同一个单元格中(即 12:00:00 AM | 7/21/2014 不是 7/21/2014 00:00:00)
2 - 您希望将所有时间戳计数分组在一个日期列表中(即,仅显示一组从星期日到星期六的数据,而不是为每个额外的日子创建一组新的列 - 如果我们从星期五开始,我们不会在星期五开始分组,如果我们在两周后的星期二结束,我们将不会有 16 列分组)
3 - 从第一行到最后一行,数据中没有空单元格。
4 - 您的时间戳和日期戳数据有标题
您应该按 alt+f11,打开包含数据和源工作表的工作簿,然后输入此代码。然后按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
答案4
您应该能够将每条记录四舍五入到最接近的五分钟。然后使用 excel 的 subtal 函数获取计数。
我将通过创建一个新的日期列(=Day(A1))和第二个时间戳列来进行四舍五入。