0

感谢我在过滤文本文件方面收到的帮助

文本文件数据示例:

user_1384   visit_2184  1330746454
user_1385   visit_2185  1330776888
user_1385   visit_2185  1330776913
user_1386   visit_2186  1330794280
user_1387   visit_2187  1330800094
user_1388   visit_2188  1330805203
user_1388   visit_2188  1330805217

在这个线程中:

Counter 函数的过滤结果

对于我的爱好项目,我选择了使用 pandas 模块过滤数据的解决方案,它就像一个魅力。

编码:

import pandas as pd

df = pd.read_csv("zadanie_3_dane.txt", header=None, sep='\s+')
df.columns = ['users', 'visits', 'dates']                
n = 1                                                   
print(df['users'].value_counts()[:n])   
print(df['visits'].value_counts()[:n])

我想学习的下一件事是计算“用户”的数量,他们在某个小时(fe 12:00 和 16:00)之间开始“访问”

“访问”的开始将是“用户”第一次登录。我只想计算唯一的“用户”,我不想计算重复的用户。

我读过我应该(我应该吗?)首先将我的日期戳格式更改为小时格式:

df.index = pd.to_datetime(df.index)
print((df['users'].between_time('12:00', '16:00')))

我的微不足道的尝试不起作用,我再次向强大的 Stack 的知识低头。

当我了解上述内容时,我还想学习如何计算同时发生的“访问”的最大数量。

如果有人对我想学习的东西有任何线索,您的帮助将不胜感激。

干杯!

4

1 回答 1

1

你实际上是正确的!只是您需要将unit='s'标志传递给您pd.to_date_time以使用该类型的时间戳。(请参阅。将 unix 时间转换为 pandas 数据框中的可读日期

import pandas as pd

df = pd.DataFrame({'users': {0: 'user_1384', 1: 'user_1385', 2: 'user_1385',
                             3: 'user_1386', 4: 'user_1387',
                             5: 'user_1388', 6: 'user_1388'},
                   'visits': {0: 'visit_2184', 1: 'visit_2185', 2: 'visit_2185',
                              3: 'visit_2186', 4: 'visit_2187',
                              5: 'visit_2188', 6: 'visit_2188'},
                   'dates': {0: 1330746454, 1: 1330776888, 2: 1330776913,
                             3: 1330794280, 4: 1330800094, 5: 1330805203,
                             6: 1330805217}})

# Need unit='s' to convert correctly
df['dates'] = pd.to_datetime(df['dates'], unit='s')
# Set Index as Dates (necessary for between_time)
df = df.set_index('dates')
# Now between_time works
print(df['users'].between_time('12:00', '16:00'))

输出:

日期
2012-03-03 12:14:48 user_1385
2012-03-03 12:15:13 user_1385
名称:用户,数据类型:对象

您可以通过使用获得唯一的用户drop_duplicates

print(df['users'].between_time('12:00', '16:00').drop_duplicates())

输出:

日期
2012-03-03 12:14:48 user_1385
名称:用户,数据类型:对象

您可以通过将值传递给len

print(len(df['users'].between_time('12:00', '16:00').drop_duplicates()))

输出:

1

类型转换和 set_index 后的 DataFrame
                         用户访问
日期                                     
2012-03-03 03:47:34 user_1384 访问_2184
2012-03-03 12:14:48 user_1385 访问_2185
2012-03-03 12:15:13 user_1385 访问_2185
2012-03-03 17:04:40 user_1386 访问_2186
2012-03-03 18:41:34 user_1387 访问_2187
2012-03-03 20:06:43 user_1388 访问_2188
2012-03-03 20:06:57 user_1388 访问_2188
于 2021-05-01T23:36:21.563 回答