如何以timedelta格式绘制带有日期和时间的时间分布直方图-Python?

问题描述

我有一个数据框,其中显示了唯一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万行)?因为持续时间不是日期格式,所以我不确定是否仍然可以使用几天,几小时或几分钟来创建直方图?

谢谢

解决方法

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

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)

enter image description here

,

使用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')

结果:

enter image description here