如何以 timedelta 格式绘制包含日期和时间的时间分布直方图 - python?
How to plot a time distribution histogram with days and time in timedelta format - 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)
使用 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')
结果:
我有一个显示唯一 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)
使用 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')
结果: