在 excel 中对块中包含的数据进行排序

Sort data contained in blocks in excel

提问人:James Davies 提问时间:11/28/2022 最后编辑:James Davies 更新时间:11/29/2022 访问量:126

问:

我在 excel 中有大量参考数据,我正在尝试以各种方式操作这些数据。我在结构和分类为更易于管理的格式的方式方面遇到了一些问题。

问题1: 我有三列。A 列首先包含日期,然后是高或低的指示符。B 列包含时间,C 列包含高度。

我想按 B 列对数据进行排序(很简单),但我希望保留 A 列中的日期标题。这几乎就像我有 365 个表,每个表都有 3 到 5 条数据 - 我只希望对每个日期内的 3 到 5 条数据进行排序。

这是我目前所拥有的:

excel data in 3 columns

我先获取数据并以其他方式操作它没有问题 - 这最终是我能够获取一批数据(5 个不同的参考点,每个参考点为 365 天)并开发一个流程来清理它并按时间顺序显示它,以及能够将其转换为问题 2 的可用格式(我需要通过一旦我有了排序数据)。

这就是我想要的样子(我手动浏览了这些块中的每一个并对其进行了排序):

enter image description here

Excel 排序 数据操作

评论

0赞 David Leal 11/28/2022
使用数据透视表怎么样?
0赞 David Leal 11/28/2022
您提到您希望按 C 列对数据进行排序,但示例输出似乎没有按此列进行排序。你能澄清一下吗?谢谢
0赞 James Davies 11/29/2022
谢谢大卫 - 对于数据透视表,我会旋转它,然后对其进行排序?您在 c 列问题上是正确的 - 应该阅读 b 列。它需要按 b 列排序。
0赞 James Davies 11/29/2022
数据透视表似乎不起作用 - 因为它将日期视为 A 列的“标题”,因此我需要以某种方式将标题放在 b 列和 c 列上。
1赞 xQbert 11/29/2022
在每条记录上添加一列日期。然后,您只需按两列进行排序

答:

2赞 David Leal 11/29/2022 #1

可以在Excel中执行此操作,在单元格中如下所示:E2

=LET(rng, A1:C11, set, FILTER(rng, (INDEX(rng,,1) <>"")),
  dates, SCAN("", INDEX(set,,1), LAMBDA(acc, item, IF(ISNUMBER(item), item, acc))),
  in, FILTER(HSTACK(dates, set), INDEX(set,,2)<>""), inDates, INDEX(in,,1),
  out, REDUCE("", UNIQUE(inDates), LAMBDA(acc, date,
    LET(sorted, VSTACK(date, DROP(SORT(FILTER(in, inDates = date),3),,1), {"","",""}),
    VSTACK(acc, sorted)
  ))), IFERROR(DROP(DROP(out,1),-1),"")
)

输出如下:sample excel file

您可以避免清理过程,但删除最后一行除外,如下所示:

=LET(rng, A1:C11, set, FILTER(rng, (INDEX(rng,,1) <>"")),
  dates, SCAN("", INDEX(set,,1), LAMBDA(acc, item, IF(ISNUMBER(item), item, acc))),
  in, FILTER(HSTACK(dates, set), INDEX(set,,2)<>""), inDates, INDEX(in,,1),
  out, REDUCE("", UNIQUE(inDates), LAMBDA(acc, date,
    LET(sorted, VSTACK(HSTACK(date,"",""), DROP(SORT(FILTER(in, inDates = date),3),,1), 
      {"","",""}), IF(MAX(LEN(acc))=0, sorted, VSTACK(acc, sorted))
  ))), DROP(out, -1)
)

解释

基本上是执行手动步骤,但使用 excel 函数。名称 与输入数据 () 相同,但我们删除了空行。名称 是与 相同大小的列,重复所有日期。函数中标识新日期的条件是因为日期以整数形式存储在 Excel 中。该名称包含我们想要的格式的数据,用于按日期进行排序和筛选,删除日期标题并添加 .setrngdatesrngSCANISNUMBERindates

现在我们使用模式(检查问题的答案:如何在 Excel 中将表格从垂直转换为水平,但具有不同的长度,由 David Leal 提供)为给定的唯一值附加每个排序数据。我们添加 作为第一行,然后对数据进行排序,最后添加一个空行来分隔每组数据。最后,我们进行清理以删除值以及第一个和最后一个空行。DROP/REDUCE/VSTACKdatedateIFERROR/DROP#N/A

评论

1赞 James Davies 11/29/2022
高超。这正是我想要的。非常非常感谢。
1赞 xQbert 11/29/2022
对 Excel 的理解达到了一个全新的水平。
1赞 David Leal 11/29/2022
是的,您可以尝试以下操作:=LET(rng, A1:C11, set, FILTER(rng, (INDEX(rng,,1) <>"")), dates, SCAN("", INDEX(set,,1), LAMBDA(acc,item, IF(ISNUMBER(item), item, acc))), in, FILTER(HSTACK(dates, set), INDEX(set,,2)<>""), inDates, INDEX(in,,1), out, REDUCE("", UNIQUE(inDates), LAMBDA(acc,date, LET(sorted, DROP(SORT(FILTER(in, inDates = date),3),,1), addDateInfo, HSTACK(INDEX(sorted,,1), INDEX(sorted,,2)+ date, INDEX(sorted,,3)), blockInfo, VSTACK(HSTACK(date,"",""), addDateInfo, {"","",""}), IF(MAX(LEN(acc))=0, blockInfo, VSTACK(acc, blockInfo)) ))), DROP(out, -1) )
1赞 James Davies 11/29/2022
言语无法表达我对@DavidLeal的感激之情。这刚刚使一项非常费力的任务 100000 变得简单。像魅力一样工作。
1赞 David Leal 11/30/2022
不客气@JamesDavies,今天我正在帮助你,将来你可以帮助别人,同样,这个社区的其他人过去帮助了我很多。我很高兴它奏效了。