【问题标题】:Date manipulation periods日期操作周期
【发布时间】:2018-08-01 12:03:37
【问题描述】:

我有这个工作问题。所以我有这个数据集如下:

Client  Date    Transaction Num
A   7/20/2017   1
A   7/26/2017   1
A   7/31/2017   1
A   8/23/2017   2
A   8/31/2017   2
A   9/11/2017   2
A   9/19/2017   3
A   9/27/2017   3
A   10/4/2017   3
B   6/1/2017    1
B   6/29/2017   1
B   7/6/2017    2
B   8/27/2017   3
B   9/28/2017   4
B   10/16/2017  4
B   11/30/2017  5

我需要做的是根据每个客户的日期生成交易编号,如下所示:

对于开始日期(对于客户 A,它是 2017 年 7 月 20 日),我需要分配一个开始交易编号 = 1。然后从该开始日期起每 30 天,我需要将交易编号增加一。因此,从 7/20/17 开始的 30 天是 8/19/17,因此在此范围内的所有日期都获得事务编号 =1,然后如果超过,则事务编号从开始日期起每 30 天递增 1。这种模式继续下去,所以从 8/19/17 开始的 30 天是 9/18/17,所以在这个范围内的日期得到事务 num = 2,在 9/18/17 之后,得到事务 num = 3,依此类推。

我需要为大型 Excel 执行此操作。任何帮助,将不胜感激。如果在 python 中更容易,请告诉我。

谢谢, 萨米

【问题讨论】:

  • 日期是否会像您展示的那样按升序排列(除了 B 中的第一个可能应该是 A)?
  • 是的,对于每个客户,日期将按升序排列(我更正了 B 第一行的错误)。

标签: python excel csv analytics etl


【解决方案1】:

有趣的问题,可能有多种解决方案,但我想出了以下一个:

所以在 C1 中输入这个公式:

=FLOOR(ROUND(B1-MIN(IF($A$1:$A$17=A1,$B$1:$B$17)),1)/30,1)+1

用 CTRL+SHIFT+ENTER 确认,然后向下拖动公式。

注意:对于日期布局的差异,我必须处理荷兰语版本的 Excel :)

编辑:解释

第 1 步 - 获取与单元格 A1 对应的最短日期:

=MIN(IF($A$1:$A$17=A1,$B$1:$B$17))

第 2 步 - 获取单元格 B1 的差异和最小值并将其舍入。小数点是 1 还是 0 无关紧要:

=ROUND(B1-MIN(IF($A$1:$A$17=A1,$B$1:$B$17)),1)

第 3 步 - 通过 30 天划分差异:

=ROUND(B1-MIN(IF($A$1:$A$17=A1,$B$1:$B$17)),1)/30

第 4 步 - 确保将此结果四舍五入到以下(可能是英语不好),并使用 floor function 到您想要四舍五入的最接近的倍数。在这种情况下,它将是 1。

=FLOOR(ROUND(B1-MIN(IF($A$1:$A$17=A1,$B$1:$B$17)),1)/30,1)

第 5 步 - 现在我们只需要在这个结果上加 1 以防止从 0 开始

=FLOOR(ROUND(B1-MIN(IF($A$1:$A$17=A1,$B$1:$B$17)),1)/30,1)+1

通过CTRL+SHIFT+ENTER全部确认

【讨论】:

  • @Sammy7,我希望我的解释能做到:)
  • 酷,除了公式如何知道遇到下一个客户(例如“B”)然后使用一组新的最小日期之外,我得到了所有信息?
  • 不错的答案。如果您有幸拥有 Excel 365,也可以使用 MINIFS :-)
  • 因为您将向下拖动公式,它将在该行的列中查找。最小值查找在整个 b 列中搜索最小值,而列中的条件必须是该查找值
【解决方案2】:

如果日期是有序的,你可以做一个 VLOOKUP 来得到第一个并减去,但@JvdV 的答案更笼统

=INT((B2-VLOOKUP(A2,A:B,2,FALSE))/30)+1

【讨论】:

  • 不错的汤姆! :)
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2017-08-17
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多