场景:我有一个示例数据框,如下所示
user_id | date_login
--------|-----------
101 | 2015-10-11
101 | 2015-10-12
101 | 2015-11-01
101 | 2015-11-02
101 | 2015-11-03
102 | 2015-10-12
102 | 2015-10-13
...
我想知道用户的最长活动天数,这意味着他/她保持登录系统的连续天数。对于上面的示例数据框,所需的结果应如下所示返回:
user_id | max_continuous_login_count
--------|-----------
101|3
102|2
我正在考虑将日期转换为数字进行比较,是否有必要,是否有任何好的做法?
感谢您的帮助,
答案 0 :(得分:0)
解决方案:
import operator
import datetime
from collections import defaultdict
from functools import reduce
dataset = [(101, "2015-10-11"), (101, "2015-10-12"), (102, "2015-10-13")]
data = defaultdict(list)
for user, date in dataset:
data[user].append(datetime.datetime.strptime(date, "%Y-%m-%d").date())
data[user].sort()
def count_days(data, new_date):
max_days, current_max, last_date = data
# Check if there's one day difference, else, reset back to 1.
if abs((new_date - last_date).days) != 1:
current_max = 0
current_max += 1
return max(max_days, current_max), current_max, new_date
result = {}
for user, dates in data.items():
result[user] = reduce(count_days, dates, (0, 0, datetime.date.min))[0]
我在这里做的是首先将数据集转换为映射用户及其登录日期的dict。在路上,我将日期转换为日期对象,并按正确的顺序对它们进行排序(以防数据集出现乱码)。
然后我创建了一个函数count_days()
,它检查两个日期之间的差异是否为1天。如果是,则增加最大天数。然后,通过使用reduce,我创建了一个新的结果dict,将用户id映射到max_days。