【问题标题】:How to plot a time distribution histogram with days and time in timedelta format - python?如何以 timedelta 格式绘制带有天数和时间的时间分布直方图 - python?
【发布时间】:2020-12-14 02:30:54
【问题描述】:

我有一个数据框显示唯一 ID 和它们的活动时间(即 ID 1821 显示活动时间为 170 天、12 小时、34 分钟和 12 秒):

     ID      Duration

0  1821      170 days 12:34:12
1  1245       30 days 11:11:23
2  1345      110 days 15:12:01 
3  8782       22 days 22:01:11 
4  8123       21 days 01:13:42
5  9292        0 days 12:12:14
6  1921       11 days 22:11:41
7  1920       12 days 02:12:58
8  9182      160 days 21:11:04

有没有一种方法可以使用这些数据创建直方图来显示所有 ID 的时间分布(原始数据包含 100 万行)?因为持续时间不是日期格式,我不确定是否有办法仍然使用天、小时或分钟来创建直方图?

谢谢

【问题讨论】:

    标签: python pandas numpy matplotlib histogram


    【解决方案1】:

    使用pd.cut 将列Duration 的值分箱为离散的天数间隔,然后在此分类系列上使用Series.value_counts + Series.sort_index 以获取每个间隔中的频率分布,然后使用Series.plot 和可选论据kind='bar':

    bins = range(0, df['Duration'].max().days + 10, 10)
    data = pd.cut(df['Duration'].dt.days, bins, include_lowest=True)
    data.value_counts().sort_index().plot(kind='bar')
    
    plt.xlabel('Days Active')
    plt.ylabel('Number of Users Active')
    plt.title('Distribution of Active users')
    

    结果:

    【讨论】:

    • 这是完美的 :) 再次感谢您
    【解决方案2】:

    我将所有天数和小时数转换为一个数字,但我将它们全部转换为秒以可视化它们的频率。

    import pandas as pd
    import numpy as np
    import datetime
    import io
    
    data = '''
     ID Duration
    0  1821 "170 days 12:34:12"
    1  1245 "30 days 11:11:23"
    2  1345 "110 days 15:12:01" 
    3  8782 "22 days 22:01:11" 
    4  8123 "21 days 01:13:42"
    5  9292 "0 days 12:12:14"
    6  1921 "11 days 22:11:41"
    7  1920  "2 days 02:12:58"
    8  9182 "160 days 21:11:04"
    '''
    
    df = pd.read_csv(io.StringIO(data), sep='\s+')
    
    df1 = pd.concat([df['ID'], df['Duration'].str.split(' days ', expand=True)], axis=1)
    df1.rename(columns={0:'days',1:'time'}, inplace=True)
    df1['time'] = pd.to_datetime(df1['time'])
    df1['days'] = df1['days'].astype(int)
    df1['total_seconds'] = (df1['days'] * 24 * 60 * 60) + (df1['time'].dt.hour * 60 * 60) + (df1['time'].dt.minute * 60) + df1['time'].dt.second
    df1[['total_seconds']].plot.hist(bins=12)
    

    【讨论】:

    • 嗨,我用我的其余数据运行此代码,我收到错误消息:AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas -> 会你碰巧知道为什么会这样吗?
    • 我已经将样本数据作为一个字符串,并包含了相应的过程。我认为来自df1['time'] 的一行就可以完成这项工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2023-04-06
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多