【问题标题】:Pandas - Converting every hour of an event duration to a separate rowPandas - 将事件持续时间的每一小时转换为单独的行
【发布时间】:2019-04-06 22:51:05
【问题描述】:

一个开始 df 的例子是:

import pandas as pd
df = pd.DataFrame({'event_id': ['123', '456'], 
                   'date': ['2018-01-01', '2018-01-01'], 
                   'start_hour' : ['10', '13'],
                   'duration' : ['1.5', '3']})
df

  event_id        date start_hour duration
0      123  2018-01-01         10      1.5
1      456  2018-01-01         13        3

必要的输出是一个很长的 df,其中每小时发生一个事件有一行。非整数的持续时间应四舍五入到下一个整数(例如,1.25 应为 2)

例子:

result_df = pd.DataFrame({'event_id': ['123', '123', '456', '456', '456'], 
                   'date': ['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-01', '2018-01-01'], 
                   'hour' : ['10', '11', '13', '14', '15']})

result_df

  event_id        date hour
0      123  2018-01-01   10
1      123  2018-01-01   11
2      456  2018-01-01   13
3      456  2018-01-01   14
4      456  2018-01-01   15

【问题讨论】:

    标签: python python-3.x pandas datetime


    【解决方案1】:

    使用np.repeatcumcount

    df = pd.DataFrame({col: np.repeat(df[col], np.ceil(df.duration))) for col in df.columns})
    
    df['start_hour'] += df.groupby('event_id').start_hour.cumcount()
    

    输出

        event_id    date        start_hour  
    0   123         2018-01-01  10         
    0   123         2018-01-01  11         
    1   456         2018-01-01  13         
    1   456         2018-01-01  14         
    1   456         2018-01-01  15         
    

    这一切都假设您的start_hourduration 列有数字 而不是字符串。在您提供的 MCVE 中,您有字符串。如果是这种情况,请先使用

    将它们设为数字
    df['duration'] = pd.to_numeric(df['duration'])
    

    【讨论】:

    • 很高兴我能帮助 ctd25。谢谢,@jez ;}
    【解决方案2】:

    接受的答案不正确。 TO 要求:

    非整数的持续时间应四舍五入到下一个整数(例如,1.25 应为 2)

    但是对于1.25df.duration.round(0)1 而不是2

    我还不能发表评论。因此,我将其发布为新答案。

    【讨论】:

    • Good remark :} 刚刚编辑以确保没有歧义。谢谢!
    猜你喜欢
    • 2019-04-21
    • 1970-01-01
    • 2020-05-05
    • 2020-09-05
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多