【问题标题】:Creating Random sorted dates from date range in Pandas从 Pandas 的日期范围创建随机排序的日期
【发布时间】:2019-05-03 12:41:55
【问题描述】:

当前数据帧:

    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 年 6 月 30 日”到“2018 年 11 月 30 日”的范围内创建随机的“交易日期”,并按“帐户 ID”组排序。对于每组 'Account 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”系列。 有什么更好的方法请推荐。谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我会定义一个自定义函数,并使用groupby().transform 应用它。该函数执行以下操作:

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

    2:获取n个随机整数(n为每组的大小,整数代表开始日后的天数),并排序 p>

    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
    

    【讨论】:

    • 太棒了@sacul!!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 2022-11-17
    • 2019-06-12
    • 2013-04-14
    • 2012-11-06
    相关资源
    最近更新 更多