从熊猫中的日期范围创建随机排序的日期

时间:2018-12-01 17:02:59

标签: python pandas dataframe

当前数据框:

    Account_ID  Transaction_Type    Transaction_Date
0   10001        B                      
1   10001        B                      
2   10001        B                      
3   10001        B                      
4   10002        D                      
5   10002        D                      
6   10002        D                      
7   10003        F                      
8   10003        F                      
9   10004        H      

我正在尝试在'2018-06-30'到'2018-11-30'的范围内创建随机的'交易日期',该日期针对“帐户ID”组进行了排序。对于每组“帐户ID”,随机日期应考虑指定的范围。

预期输出:

    Account_ID  Transaction_Type    Transaction_Date
0   10001        B                  2018-06-30  
1   10001        B                  2018-07-15  
2   10001        B                  2018-07-22  
3   10001        B                  2018-09-14  
4   10002        D                  2018-07-02  
5   10002        D                  2018-07-29  
6   10002        D                  2018-10-20  
7   10003        F                  2018-07-07  
8   10003        F                  2018-11-11  
9   10004        H                  2018-06-30  

我正在尝试以下逻辑。

在accountid上进行分组,获取每个组的计数,使用每个组的计数样本在上述范围内生成随机日期列表,并使用loc将列表元素分配给“ Transaction_Date”系列。 有更好的方法请提出建议。谢谢!

1 个答案:

答案 0 :(得分:0)

我将定义一个自定义函数,并将其与groupby().transform一起应用。该函数执行以下操作:

1:获取开始日期和结束日期之间的天数

2:获取 n 个随机整数( n 是每个组的大小,整数代表开始日期之后的天数),并对它们进行排序

3:将这些随机整数作为天的时间增量添加到开始日期。

start_date = pd.to_datetime('2018-06-30')
end_date = pd.to_datetime('2018-11-30')

def gen_rand_date(group, start_date = start_date, end_date = end_date):
    # step 1 in description above:
    days = (end_date - start_date).days
    # step 2:
    d = pd.np.sort(pd.np.random.choice(range(days), len(group)))
    # step 3:
    return start_date + pd.to_timedelta(d,unit='D')

df['Transaction_Date'] = df.groupby('Account_ID').transform(lambda x: gen_rand_date(x))

>>> df
   Account_ID Transaction_Type Transaction_Date
0       10001                B       2018-07-19
1       10001                B       2018-08-12
2       10001                B       2018-08-27
3       10001                B       2018-09-29
4       10002                D       2018-10-23
5       10002                D       2018-11-09
6       10002                D       2018-11-14
7       10003                F       2018-08-03
8       10003                F       2018-09-10
9       10004                H       2018-09-16