日期操纵期

时间:2018-08-01 12:03:38

标签: python excel csv analytics etl

我有这个工作问题。因此,我具有以下数据集:

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,它是7/20/17),我需要分配一个开始交易编号=1。然后从该开始日期起每30天,我需要将交易编号增加一。因此,从7/20/17开始的30天为8/19/17,因此所有在此范围内的日期都会获得交易编号= 1,如果超过该日期,则交易编号将从开始日期起每30天增加1。这种模式还在继续,因此从8/19/17开始的30天是9/18/17,因此此范围内的日期获取的交易数= 2,然后在9/18/17之后的交易数= 3,依此类推。

我需要这样做才能获得很大的成就。任何帮助,将不胜感激。如果在python中更简单,请也告诉我。

谢谢, 萨米

2 个答案:

答案 0 :(得分:1)

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

enter image description here

因此在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步-确保将此结果四舍五入到下面(可能是英语不好),并将下限函数最接近您要四舍五入的倍数。在这种情况下,它将是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确认所有

答案 1 :(得分:0)

如果日期按顺序排列,您可以执行VLOOKUP来获取第一个并减去,但是@JvdV的答案更为笼统

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