Google Sheets:按工作日计算时长平均值的技术问询
嘿,我明白你的困扰——用工作日做透视表时,默认的计算逻辑没get到你要的“平均时长”,反而给了条目数的平均对吧?咱们先把数据拆成规范格式,再调整透视表的设置,就能完美解决了。
第一步:先把合并的原始数据拆成规范列
你的原始数据是日期、工作日、时长混在一个单元格里,这是透视表出错的根源之一。假设原始数据在A列(从A2开始),我们需要拆分出3个独立列:
日期列(B列):提取完整的日期部分(比如
16-Apr (Mon)),用公式:=TRIM(REGEXEXTRACT(A2,"^.+?\)"))这个公式会提取到括号及之前的内容,再用
TRIM清理多余空格(比如Sat )里的空格)。工作日列(C列):单独提取周一/周二这类标识,用:
=TRIM(REGEXEXTRACT(A2,"\((.+?)\)"))提取括号里的内容并清理空格,得到干净的
Mon/Tue等。时长数值列(D列):提取纯数字的时长(去掉
mins),转成数值方便计算:=REGEXEXTRACT(A2,"(\d+)\s*mins")*1这个公式会提取数字部分,乘以1把文本转成数值型。
填充完这三列后,你的数据就变成了结构化的日期、工作日、时长数值,接下来就可以正确做透视表了。
第二步:根据你的需求选择透视表设置
你提到现在得到的是“条目数的平均值”,大概率是值字段的计算方式选错了,或者没区分两种常见的“平均”需求:
需求1:每个工作日的单条记录平均时长(总时长÷记录条数)
比如你的周一有3条记录(30+90+60),想得到(30+90+60)/3=60:
- 选中B2:D(结构化后的所有数据),插入透视表。
- 在透视表编辑器里:
- 行:选择「工作日」
- 值:选择「时长」,然后点击值字段的下拉菜单,把计算方式从「求和」改成「平均值」。
- 这样得到的就是每个工作日下所有记录的时长平均值,完全符合单条记录的平均逻辑。
需求2:每个工作日的日均时长(总时长÷该工作日的日期天数)
比如你的周一有2个不同日期(4.16和4.23),总时长是120+60=180,想得到180/2=90:
- 先计算每个日期的总时长:用
QUERY函数生成每日汇总表(放在E列开始):
这个公式会输出每个日期对应的总时长,比如=QUERY(B:D,"select B, sum(D) group by B label sum(D) '每日总时长'")16-Apr (Mon)对应120,23-April (Mon)对应60。 - 给这个汇总表添加工作日列(比如F列),用之前的工作日公式提取:
=TRIM(REGEXEXTRACT(E2,"\((.+?)\)")) - 选中E:F的汇总数据,插入透视表:
- 行:选择「工作日」
- 值:选择「每日总时长」,把计算方式改成「平均值」。
- 这样得到的就是每个工作日下,所有日期的日均时长,符合“按日期维度的总时长再按工作日平均”的逻辑。
排查小技巧
如果还是得到条目数的平均,检查这两点:
- 确认D列的时长是数值型(不是文本):选中D列,看顶部格式菜单是不是「数字」而非「文本」。
- 透视表的值字段是不是选了「时长」,而不是「日期」或「工作日」的计数。
内容的提问来源于stack exchange,提问作者user358360




