Pandas:如何分析带有开始和结束时间戳的数据?

Posted

技术标签:

【中文标题】Pandas:如何分析带有开始和结束时间戳的数据?【英文标题】:Pandas: How to analyse data with start and end timestamp? 【发布时间】:2018-01-03 22:16:34 【问题描述】:

我必须分析在给定时间段内使用应用程序的用户的活动,时间段是开始和结束时间戳。我尝试使用条形图,但我不知道如何在间隔中包含小时数。 例如:uid=2 的用户使用位于 [18, 19, 20, 21] 的应用程序

我的数据框是这样的:

uid           sex          start                 end
1             0       2000-01-28 16:47:00   2000-01-28 17:47:00
2             1       2000-01-28 18:07:00   2000-01-28 21:47:00
3             1       2000-01-28 18:47:00   2000-01-28 20:17:00
4             0       2000-01-28 08:00:00   2000-01-28 10:00:00
5             1       2000-01-28 02:05:00   2000-01-28 02:30:00
6             0       2000-01-28 15:10:00   2000-01-28 18:04:00
7             0       2000-01-28 01:50:00   2000-01-28 03:00:00


df['hour_s'] = pd.to_datetime(df['start']).apply(lambda x: x.hour)
df['hour_e'] = pd.to_datetime(df['end']).apply(lambda x: x.hour)

uid           sex          start                 end              hour_s      hour_e
1             0       2000-01-28 16:47:00   2000-01-28 17:47:00   16          17
2             1       2000-01-28 18:07:00   2000-01-28 21:47:00   18          21
3             1       2000-01-28 18:47:00   2000-01-28 20:17:00   18          20
4             0       2000-01-28 08:00:00   2000-01-28 10:00:00   08          10
5             1       2000-01-28 02:05:00   2000-01-28 02:30:00   02          02
6             0       2000-01-28 15:10:00   2000-01-28 18:04:00   15          18
7             0       2000-01-28 01:50:00   2000-01-28 03:00:00   01          03

我必须在特定时间找到用户数

【问题讨论】:

This blog post给出了你想要的详细例子,请看一下 甚至更好,here 【参考方案1】:

我不确定您是否在寻找甘特图。如果是这样,@Vinícius Aguiar 的提示在 cmets 中。

从你的最后一行

我必须在特定小时内找到用户数

您似乎需要一个显示用户数量(频率)的直方图,以一天中的小时为中心。 如果是这种情况,您可以这样做:

#! /usr/bin/python3

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# Read the data
df=pd.read_csv("data.csv")

# Get all hours per user (per observation)
def sum_hours(obs):
    return(list(range(obs['hour_s'],obs['hour_e']+1,1)))

# Get all existing activity hours (No matter which user)
Hours2D=list(df.apply(sum_hours,axis=1))
# Get all existing hours
HoursFlat=[hour for sublist in Hours2D for hour in sublist]

plt.hist(HoursFlat,rwidth=0.5,range=(0,24))
plt.xticks(np.arange(0,24, 1.0))
plt.xlabel('Hour of day')
plt.ylabel('Users')
plt.show()

data.csv 是您提供的示例:

uid, sex,start,end,hour_s,hour_e
1,0,2000-01-28 16:47:00,2000-01-28 17:47:00,16,17
2,1,2000-01-28 18:07:00,2000-01-28 21:47:00,18,21
3,1,2000-01-28 18:47:00,2000-01-28 20:17:00,18,20
4,0,2000-01-28 08:00:00,2000-01-28 10:00:00,08,10
5,1,2000-01-28 02:05:00,2000-01-28 02:30:00,02,02
6,0,2000-01-28 15:10:00,2000-01-28 18:04:00,15,18
7,0,2000-01-28 01:50:00,2000-01-28 03:00:00,01,03

您应该得到以下图表:

【讨论】:

您还可以获取 Hours2D 和 HoursFlat 变量并运行其他分析,而不仅仅是可视化。 (异常值、白天聚类等) 请注意,这只是一个定向示例,并且仅当您的观察结果在您的示例数据集中每个用户每天都是唯一的时才有效。

以上是关于Pandas:如何分析带有开始和结束时间戳的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 InfluxDB 中编辑测量值(= 带有时间戳的值集)?

Pandas Dataframe 时间序列重新采样,如何修改 bin 以适应底层数据集的开始和结束时间

Plotly:如何在绘图线图中的特定点添加标记(python / pandas)

PHP技术分享-起始时间戳和结束时间戳的方法

php 获取今日昨日上周本月的起始时间戳和结束时间戳的方法

Pandas - 将具有开始和结束日期的数据框转换为每日数据