gpt4 book ai didi

python - 计算时间序列数据中连续天数和缺失天数的总数

转载 作者:行者123 更新时间:2023-12-01 02:59:08 25 4
gpt4 key购买 nike

我有一个看起来像这样的数据框(通常它有很多用户):

userid  |  activityday
222 2015-01-09 12:00
222 2015-01-10 12:00
222 2015-01-11 12:00
222 2015-01-13 12:00
222 2015-01-14 12:00
222 2015-01-15 12:00
222 2015-01-17 12:00
222 2015-01-18 12:00
222 2015-01-19 12:00
222 2015-01-20 12:00
222 2015-01-20 12:00

我想获取在给定日期之前连续活跃和不活跃的总天数。例如,如果日期是 2015-01-23 则:

userid | days_active_jb  | days_inactive_jb | ttl_days_active | ttl_days_inactive
222 | 3 | 2 | 10 | 2

或者,如果给定日期是2015-01-15,则:

userid | days_active_jb  | days_inactive_jb | ttl_days_active | ttl_days_inactive
222 | 2 | 0 | 5 | 1

我需要处理大约 300.000 行才能获得最终的数据帧。我想知道实现这一目标的有效方法是什么。有什么想法吗?

以下是每列的说明:

days_active_jb:学生在给定日期之前连续进行事件的天数。

days_inactive_jb:学生在给定日期之前连续没有事件的天数。

ttl_days_active:学生在给定日期之前的任何一天进行事件的天数。

ttl_days_inactive:学生在给定日期之前的任何一天没有事件的天数。

最佳答案

设置:

df
Out[1714]:
userid activityday
0 222 2015-01-09 12:00:00
1 222 2015-01-10 12:00:00
2 222 2015-01-11 12:00:00
3 222 2015-01-13 12:00:00
4 222 2015-01-14 12:00:00
5 222 2015-01-15 12:00:00
6 222 2015-01-17 12:00:00
7 222 2015-01-18 12:00:00
8 222 2015-01-19 12:00:00
9 222 2015-01-20 12:00:00
11 322 2015-01-09 12:00:00
12 322 2015-01-10 12:00:00
13 322 2015-01-11 12:00:00
14 322 2015-01-13 12:00:00
15 322 2015-01-14 12:00:00
16 322 2015-01-15 12:00:00
17 322 2015-01-17 12:00:00
18 322 2015-01-18 12:00:00
19 322 2015-01-19 12:00:00
20 322 2015-01-20 12:00:00

解决方案

def days_active_jb(x):
x = x[x<pd.to_datetime(cut_off_days)]
if len(x) == 0:
return 0
x = [e.date() for e in x.sort_values(ascending=False)]
prev = x.pop(0)
i = 1
for e in x:
if (prev-e).days == 1:
i+=1
prev = e
else:
break
return i

def days_inactive_jb(x):
diff = (pd.to_datetime(cut_off_days) -max(x)).days
return 0 if diff<0 else diff

def ttl_days_active(x):
x = x[x<pd.to_datetime(cut_off_days)]
return len(x[x<pd.to_datetime(cut_off_days)])

def ttl_days_inactive(x):
#counter the missing days between start and end dates
x = x[x<pd.to_datetime(cut_off_days)]
return len(pd.date_range(min(x),max(x))) - len(x)

#drop duplicate userid-activityday pairs
df = df.drop_duplicates(subset=['userid','activityday'])

cut_off_days = '2015-01-23'
df.sort_values(by=['userid','activityday'],ascending=False).\
groupby('userid')['activityday'].\
agg([days_active_jb,
days_inactive_jb,
ttl_days_active,
ttl_days_inactive]).\
astype(np.int64)

Out[1856]:
days_active_jb days_inactive_jb ttl_days_active ttl_days_inactive
userid
222 4 2 10 2
322 4 2 10 2


cut_off_days = '2015-01-15'
df.sort_values(by=['userid','activityday'],ascending=False).\
groupby('userid')['activityday'].\
agg([days_active_jb,
days_inactive_jb,
ttl_days_active,
ttl_days_inactive]).\
astype(np.int64)

Out[1863]:
days_active_jb days_inactive_jb ttl_days_active ttl_days_inactive
userid
222 2 0 5 1
322 2 0 5 1

关于python - 计算时间序列数据中连续天数和缺失天数的总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43977060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com