Excel - 自动生成日期列表,给定一列中的多个日期范围
Excel - automatically generate list of dates, given multiple date ranges in one column
我最好给你看。这是我的列表的样子:
这就是我想要的样子:
基本上,在第一张图片中,我有不同的日期范围,对于每个日期范围,我都有这两个指标,会话和用户,最终结果应该是所有日期范围爆炸成单个日期,考虑到第一行和第二行都包含某些日期可以包含在多个日期范围内(例如日期 2017-08-12)。
最后但同样重要的是,不应计算结束日期。
有人可以帮我吗?
万分感谢
A.
这是解决方案的概要:
- 将您输入的 table 中的每个 from/to 日期拆分为 2 个组成日期。您将需要使用字符串函数(
LEFT
、RIGHT
和 MID
)来提取年、月和日值的数字。这些仍然是字符串,因此使用 VALUE
函数将它们转换为实际数字,然后使用 DATE
函数将它们 assemble 转换为 [=72= 中的适当日期值]. (您可能需要使用日期格式来格式化结果,因为 Excel 将其日期存储为自 01/01/1900 以来的天数,因此 11/08/2017 在 Excel 中保存为 42958。 ) 根据需要在输入中添加尽可能多的辅助列 table 以实现此目的。
- 从每个结束日期中减去 1,这会更正日期范围,以便包括结束日期。
- 第一个开始日期和最后一个结束日期定义了输出日期的范围。因此,从第一个日期开始输出 table,并在下面的单元格中使用公式将此日期加 1 并向下复制公式,直到到达最后一个可能的输出日期。
- 要获得每个可能的输出日期的结果,您需要找到
它属于哪个日期范围。它属于一个日期范围,如果是
大于或等于范围的开始日期且小于或
等于结束日期。然而,而不是比较每个输出
具有单独开始和结束日期的日期可以进行比较
每个输出日期同时包含所有开始日期和所有结束日期。
A10>=E2:E7
等表达式生成一个包含 6 个元素的数组,其中包含值
TRUE
和FALSE
根据A10是否大于等于
分别为 E2
、E3
、E4
、E5
、E6
和 E7
。因此,您可以使用此方法生成一个 TRUE
/FALSE
值数组,显示特定输出日期是否大于或等于(即在或之后)每个范围的开始日期。同样,您可以获得一个数组,显示相同的输出日期是否小于或等于(即在或之前)每个范围的结束日期。
- 多功能
SUMPRODUCT
函数现在可用于组合数组和来自输入 table 的相关 sessions/users 值,以获得输出日期的相关值。例如,如果开始日期在 E2:E7
中,结束日期在 F2:F7
中,会话在 B2:B7
中,输出日期在 A10
中,那么 sutable 用于确定归因于输出日期的会话数的公式为 =SUMPRODUCT(($A10>=$E:$E)*($A10<=$F:$F)*(B:B))
。可以复制此公式以给出所有输出日期的结果,并且假设用户的输入数据在 C2:C7
中,如果将其复制到与会话结果相邻的列中,它也会给出用户的结果。在此公式中,TRUE
和 FALSE
值分别有效地转换为 1
和 0
。
几点:(i) 如果你不知道 Excel 中的日期是如何工作的,那么找出来,它会做一些任务,比如计算两个日期之间的天数或日期 n 天 before/after 一个特定的日期非常容易使用简单的算术; (ii) 不要将看起来像日期的文本字符串与可以在 Excel 中进行算术运算的日期混淆; (iii) 我认为您的示例中存在一些错误 - 16/08/2017 是您的两个输入范围内的日期,结果应该是 (2,2) 而不是 (1,1) 而 17/08/2017 是同样报错。
我在下图中使用了这种方法,为了测试其稳健性,我添加了一行额外的输入数据,该数据具有与用户不同的会话,并产生一个日期 (19/08/2017)不匹配任何输入范围。
生成的输出日期范围如下:
- 单元格 A10:使用公式 =E2
- 单元格A11:使用公式=1+A2
- 单元格 A12、A13、...复制单元格 A11 中的公式
我最好给你看。这是我的列表的样子:
这就是我想要的样子:
基本上,在第一张图片中,我有不同的日期范围,对于每个日期范围,我都有这两个指标,会话和用户,最终结果应该是所有日期范围爆炸成单个日期,考虑到第一行和第二行都包含某些日期可以包含在多个日期范围内(例如日期 2017-08-12)。 最后但同样重要的是,不应计算结束日期。
有人可以帮我吗?
万分感谢
A.
这是解决方案的概要:
- 将您输入的 table 中的每个 from/to 日期拆分为 2 个组成日期。您将需要使用字符串函数(
LEFT
、RIGHT
和MID
)来提取年、月和日值的数字。这些仍然是字符串,因此使用VALUE
函数将它们转换为实际数字,然后使用DATE
函数将它们 assemble 转换为 [=72= 中的适当日期值]. (您可能需要使用日期格式来格式化结果,因为 Excel 将其日期存储为自 01/01/1900 以来的天数,因此 11/08/2017 在 Excel 中保存为 42958。 ) 根据需要在输入中添加尽可能多的辅助列 table 以实现此目的。 - 从每个结束日期中减去 1,这会更正日期范围,以便包括结束日期。
- 第一个开始日期和最后一个结束日期定义了输出日期的范围。因此,从第一个日期开始输出 table,并在下面的单元格中使用公式将此日期加 1 并向下复制公式,直到到达最后一个可能的输出日期。
- 要获得每个可能的输出日期的结果,您需要找到
它属于哪个日期范围。它属于一个日期范围,如果是
大于或等于范围的开始日期且小于或
等于结束日期。然而,而不是比较每个输出
具有单独开始和结束日期的日期可以进行比较
每个输出日期同时包含所有开始日期和所有结束日期。
A10>=E2:E7
等表达式生成一个包含 6 个元素的数组,其中包含值TRUE
和FALSE
根据A10是否大于等于 分别为E2
、E3
、E4
、E5
、E6
和E7
。因此,您可以使用此方法生成一个TRUE
/FALSE
值数组,显示特定输出日期是否大于或等于(即在或之后)每个范围的开始日期。同样,您可以获得一个数组,显示相同的输出日期是否小于或等于(即在或之前)每个范围的结束日期。 - 多功能
SUMPRODUCT
函数现在可用于组合数组和来自输入 table 的相关 sessions/users 值,以获得输出日期的相关值。例如,如果开始日期在E2:E7
中,结束日期在F2:F7
中,会话在B2:B7
中,输出日期在A10
中,那么 sutable 用于确定归因于输出日期的会话数的公式为=SUMPRODUCT(($A10>=$E:$E)*($A10<=$F:$F)*(B:B))
。可以复制此公式以给出所有输出日期的结果,并且假设用户的输入数据在C2:C7
中,如果将其复制到与会话结果相邻的列中,它也会给出用户的结果。在此公式中,TRUE
和FALSE
值分别有效地转换为1
和0
。
几点:(i) 如果你不知道 Excel 中的日期是如何工作的,那么找出来,它会做一些任务,比如计算两个日期之间的天数或日期 n 天 before/after 一个特定的日期非常容易使用简单的算术; (ii) 不要将看起来像日期的文本字符串与可以在 Excel 中进行算术运算的日期混淆; (iii) 我认为您的示例中存在一些错误 - 16/08/2017 是您的两个输入范围内的日期,结果应该是 (2,2) 而不是 (1,1) 而 17/08/2017 是同样报错。
我在下图中使用了这种方法,为了测试其稳健性,我添加了一行额外的输入数据,该数据具有与用户不同的会话,并产生一个日期 (19/08/2017)不匹配任何输入范围。
生成的输出日期范围如下:
- 单元格 A10:使用公式 =E2
- 单元格A11:使用公式=1+A2
- 单元格 A12、A13、...复制单元格 A11 中的公式