【问题标题】:How calculate difference from start time until change time in pandas?如何计算从开始时间到熊猫更改时间的差异?
【发布时间】:2020-04-13 12:33:35
【问题描述】:

我有一些这样的数据:

 df = pd.DataFrame ({'id': ['A', 'A','A' ,'B', 'B','B', 'B'],
                         'cahnge' : ['False', 'True', 'False', 'False', 'Flase', 'True', 'False'],
                         'start': ['2017-1-1', '2018-5-5', '2017-5-21', '2017-6-6','2017-7-8','2017-8-9','2018-5-1'],
                        })


╔═══════╦════╦════════╦═══════════╗
║ index ║ id ║ cahnge ║   start   ║
╠═══════╬════╬════════╬═══════════╣
║     0 ║ A  ║ False  ║ 2017-1-1  ║
║     1 ║ A  ║ True   ║ 2018-5-5  ║
║     2 ║ A  ║ False  ║ 2017-5-21 ║
║     3 ║ B  ║ False  ║ 2017-6-6  ║
║     4 ║ B  ║ Flase  ║ 2017-7-8  ║
║     5 ║ B  ║ True   ║ 2017-8-9  ║
║     6 ║ B  ║ False  ║ 2018-5-1  ║
╚═══════╩════╩════════╩═══════════╝

我想使用 pandas 将其转换为如下所示:

╔═══════╦════╦══════════╦══════════╦══════╗
║ index ║ id ║  start   ║  change  ║ diff ║
╠═══════╬════╬══════════╬══════════╬══════╣
║     0 ║ A  ║ 2017-1-1 ║ 2018-5-5 ║  489 ║
║     1 ║ B  ║ 2017-6-6 ║ 2017-8-9 ║  64  ║
╚═══════╩════╩══════════╩══════════╩══════╝

结果是计算每个 id 的第一个日期与真正的更改日期之间的差异,并创建第二个表。

【问题讨论】:

    标签: pandas group-by


    【解决方案1】:

    你可以试试这个:

    df = pd.DataFrame ({'id': ['A', 'A','A' ,'B', 'B','B', 'B'],
                             'change' : ['False', 'True', 'False', 'False', 'False', 'True', 'False'],
                             'start': ['2017-1-1', '2018-5-5', '2017-5-21', '2017-6-6','2017-7-8','2017-8-9','2018-5-1'],
                            })
    

    首先,转换为日期时间类型。
    并将“更改”列中的“真/假”值转换为数字 1、0。

    喜欢这个

    df['start'] = pd.to_datetime(df['start'])
    df['change'] = np.where(df['change']=='False', 0,1)
    

    第二,通过sort_valuesdrop_duplicates创建起始数据。
    您可以使用以下代码为每个 id 具有 1(True) 值的行(带有 id 和 date 列)索引。

    start = df[['id','start']].sort_values(by=['id','start']).drop_duplicates(subset='id').reset_index(drop=True)
    print(start)
    
    
    change = df[['id','start']].loc[df.groupby('id')['change'].idxmax()].rename({'start':'change'},axis=1)
    print(change)
    
      id      start
    0  A 2017-01-01
    1  B 2017-06-06
    
      id     change
    1  A 2018-05-05
    5  B 2017-08-09
    

    第三,做一个左merge 两个数据框并使用dt 索引器计算两个日期之间的差异。

    final = start.merge(change, how='left', on ='id')
    final['diff'] = (final['start'] - final['change']).dt.days
    print(final)
    
      id      start     change  diff
    0  A 2017-01-01 2018-05-05  -489
    1  B 2017-06-06 2017-08-09   -64
    

    我希望它有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 2013-06-23
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      相关资源
      最近更新 更多