如何通过仅提取每天的特定时间来过滤具有日期和时间值的列表?

How do I filter a list with date and time values by only extracting specific times each day?

我在 A 列中列出了日期和时间。B 列是每个时间值的美元值。

我想获取每天的特定时间并在下一列中列出价格。我现在有这个:

J 列的公式是这样的:

=filter(A11:B,(mod(A11:A,1)*24)>=4.5,(mod(A11:A,1)*24)<=4.6)

此公式过滤 4:30AM 及其关联的价格。

L 列的公式是这样的:

=filter(A11:B,(mod(A11:A,1)*24)>=9.5,(mod(A11:A,1)*24)<=9.6)

只过滤 9:30AM 每天的价格。

如您所见,当 J 列为 8/12/2021 且 L 列为 8/13/2021 时,日期将停止匹配。这是因为 L 列没有 2021 年 8 月 12 日的 9:30AM,所以它跳到了 2021 年 8 月 13 日。

如果另一列与该时间不匹配,我如何才能使其中一列跳过某个日期?我不知道我是否解释得很好,但在上面的示例中,J 列应该跳过 8/12/2021,因为 L 列没有 8/12/2021.

处理此问题的另一种方法可能是使用 UNIQUE 和 FILTER 公式,但我不确定该怎么做。任何帮助将不胜感激!

这是电子表格的 link:https://docs.google.com/spreadsheets/d/1TvP0_UsYJbLb5bscx2e4nTEnSkP5roBZpP8aIGdl414/edit?usp=sharing

我不是 100% 确定,但是如果您需要过滤值以便时间元素为 09:30 和 04:30,那么隐藏日期只出现一次的值(即没有09:30 值或没有 04:30 值),您可以使用:

=arrayformula(filter(
filter(A11:B,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5)),
countif(int(filter(A11:A,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5))),int(filter(A11:A,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5))))>1)
)

在最后调整 >1 到您需要的任何逻辑(=2<>1 等)。

如果需要,您还可以在所有内容周围添加 sort()

解释:

原来mod(A11,1)*24不是特别圆,所以建议round(mod(A11:A,1)*24,2)

因此要过滤 date/times 上午 9.30 和 4.30,您可以申请:

round(mod(A11:A,1)*24,2)=9.5

round(mod(A11:A,1)*24,2)=4.5

像这样:

=arrayformula({filter(A11:B,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5))})

filter 通常是 AND 但要获得 OR 条件它是 filter(A:B,(A=1)+(A=2))

这仅获取日期:

=arrayformula(int(filter(A11:A,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5))))

然后这个计算一个日期出现了多少次:

=arrayformula(countif(int(filter(A11:A,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5))),int(filter(A11:A,(round(mod(A11:A,1)*24,2)=9.5)+(round(mod(A11:A,1)*24,2)=4.5)))))

组合元素得到解决方案。

我会在你的 sheet 中添加一个标签。

您可以过滤每个列表以在另一个列表中找到每个日期(日期时间的整数部分)的匹配项:

在 J:

=filter(A11:B,(mod(A11:A,1)*24)>=4.5,(mod(A11:A,1)*24)<=4.6,isnumber(match(int(A11:A),int(filter(A11:A,(mod(A11:A,1)*24)>=9.5,(mod(A11:A,1)*24)<=9.6)),0)))

大号:

=filter(A11:B,(mod(A11:A,1)*24)>=9.5,(mod(A11:A,1)*24)<=9.6,isnumber(match(int(A11:A),int(filter(A11:A,(mod(A11:A,1)*24)>=4.5,(mod(A11:A,1)*24)<=4.6)),0)))

备注

请参阅 Aresvik 的回答以获得可能更好的舍入方法,但请注意 4:30 (3/16) 实际上具有二进制小数的精确表示,因此舍入误差在这里不是问题。