Python 一周内发生事件的频率
我的数据包含带有日期时间信息、每个行程的用户id和行程类型(单次、往返、伪)的行程 下面是一个名为All_data的数据示例(pandas dataframe):Python 一周内发生事件的频率,python,python-3.x,pandas,anaconda,Python,Python 3.x,Pandas,Anaconda,我的数据包含带有日期时间信息、每个行程的用户id和行程类型(单次、往返、伪)的行程 下面是一个名为All_data的数据示例(pandas dataframe): HoraDTRetirada idpass type 2016-02-17 15:36:00 39579449489 'single' 2016-02-18 19:13:00 39579449489 '
HoraDTRetirada idpass type
2016-02-17 15:36:00 39579449489 'single'
2016-02-18 19:13:00 39579449489 'single'
2016-02-26 09:20:00 72986744521 'pseudo'
2016-02-27 12:11:00 72986744521 'round'
2016-02-27 14:55:00 11533148958 'pseudo'
2016-02-28 12:27:00 72986744521 'round'
2016-02-28 16:32:00 72986744521 'round'
我想计算一下用户在“一年中的一周”中每个类别重复的次数
例如,如果同一用户的事件发生在星期一,而下一个事件发生在星期四,则在同一周发生两个事件;但是,如果一个事件发生在星期六,下一个事件发生在下一个星期一,那么它们发生在不同的星期
我正在寻找的输出形式如下:
idpass weekofyear type frequency
39579449489 1 'single' 2
72986744521 2 'round' 3
72986744521 2 'pseudo' 1
11533148958 2 'pseudo' 1
编辑:这是一个类似的问题,但我不知道如何处理熊猫。我的建议是:
res['HoraDTRetirada'] = res['HoraDTRetirada'].apply(lambda x: x.week)
步骤3:
res = df.groupby(['idpass', 'type', 'HoraDTRetirada')]).count().reset_index()
这有点不同,因为“Hora”变量不再是时间,而是一个表示一周的整数
import pandas as pd
data = {"HoraDTRetirada": ["2016-02-17 15:36:00", "2016-02-18 19:13:00", "2016-12-31 09:20:00", "2016-02-28 12:11:00",
"2016-02-28 14:55:00", "2016-02-29 12:27:00", "2016-02-29 16:32:00"],
"idpass": ["39579449489", "39579449489", "72986744521", "72986744521", "11533148958", "72986744521",
"72986744521"],
"type": ["single", "single", "pseudo", "round", "pseudo", "round", "round"]}
df = pd.DataFrame.from_dict(data)
print(df)
df["HoraDTRetirada"] = pd.to_datetime(df['HoraDTRetirada'])
df["week"] = df['HoraDTRetirada'].dt.strftime('%U')
k = df.groupby(["idpass", "week", "type"],as_index=False).count()
print(k)
输出:
HoraDTRetirada idpass type
0 2016-02-17 15:36:00 39579449489 single
1 2016-02-18 19:13:00 39579449489 single
2 2016-12-31 09:20:00 72986744521 pseudo
3 2016-02-28 12:11:00 72986744521 round
4 2016-02-28 14:55:00 11533148958 pseudo
5 2016-02-29 12:27:00 72986744521 round
6 2016-02-29 16:32:00 72986744521 round
idpass week type HoraDTRetirada
0 11533148958 09 pseudo 1
1 39579449489 07 single 2
2 72986744521 09 round 3
3 72986744521 52 pseudo 1
这就是我得到我想要的东西的原因: 已跳过建议答案中的步骤1,因为时间戳已经是datetime形式 步骤2:为一年中的一周创建列:
df['week']=df['horadretirida'].dt.strftime(“%U”)
步骤3:按用户id、类型和周分组,并使用size()计算值
df.groupby(['idpass','type','week']).size()
df中的最后一个示例是2月30日。如果您使用标准库进行日期转换,这可能会给您带来错误。谢谢,我修复了它。例如,我很快修改了它,没有注意月份。所有数据点都来自同一年吗?我想按周分组,因此我认为在您的模型中,步骤3应该在步骤2之前,按周分组,而不是按日期时间分组。我尝试这样做,但我得到了以下错误:TypeError:仅对DatetimeIndex、TimedeltaIndex或PeriodIndex有效,但得到了“Index”的一个实例
Updated-请告诉我现在是否可以我的原始数据集的列数比示例中列出的列数多,所以这个方法最终会打印出我不想要的所有其他列。不过,周数正是我想要的。谢谢。我只需执行以下操作即可获得所需的输出:All_Data.groupby(['idpass','type','week']).size()”
,而不是您的最后一行。