【发布时间】:2023-03-15 21:37:01
【问题描述】:
我正在尝试计算应用上用户名状态从原始安装/重新安装到卸载(反之亦然)之间的时间。我已经用 Python 编程了大约一年左右,所以我的函数有时速度较慢或不是最优的;我对这个任务有类似的问题。
我使用以下循环来计算状态之间的时间差。主要问题是这个函数非常慢(对于我正在处理的 700k 行数据),并且它不会返回所有时间间隔。
# Import modules
import pandas as pd
import numpy as np
# Load sample data
data = pd.read_csv('username_status_dates.csv').drop(columns='index')
data['Date'] = pd.to_datetime(data['Date'], format='%Y-%M-%d')
# Create dataframe to record time intervals
customerStatuses_df = pd.DataFrame(columns=['username', 'status1', 'status2', 'timeToUninstall', 'timeToReinstall'])
# Iterate over data, calculate time intervals (by username), and add to customerStatuses
for user in data:
# Get user sub data
user_df = data.loc[ customerStatuses_df['Username'] == user ]
dates = list(user_df['Date'])
status = list(user_df['Status'])
for val in np.arange(0, len(status) - 1):
# If status in installed (original or re)
if (status[val] == 'Original Install') or (status[val] == 'Reinstall'):
# If next status is uninstall (un)
if status[val + 1] == 'Uninstall':
# Calculate time interval between statuses
d_unin = dates[val + 1] - dates[val]
# Add to customerStatuses
customerStatuses_df = customerStatuses_df.append({'username': user, 'status1': status[val], 'status2': status[val+1], 'timeToUninstall': d_unin}, ignore_index=True)
# If status in not installed (un)
elif (status[val] == 'Uninstall'):
# If next status is installed (re)
if status[val + 1] == 'Reinstall':
# Calculate time interval between statuses
d_rein = dates[val + 1] - dates[val]
# Add to customerStatuses
customerStatuses_df = customerStatuses_df.append({'username': user, 'status1': status[val], 'status2': status[val+1], 'timeToReinstall': d_rein}, ignore_index=True)
样本数据: username_status_dates.csv
Username Status Date
0 Joey74 Original Install 2019-01-20 00:09:00
1 Sam22 Original Install 2019-01-15 00:10:00
2 Chloe35 Uninstall 2019-01-30 00:10:00
3 Sam22 Uninstall 2019-01-01 00:11:00
4 Zoe44 Reinstall 2019-01-10 00:12:00
5 Joey74 Reinstall 2019-01-20 00:12:00
6 Shelby99 Original Install 2020-01-07 00:01:00
7 Joey74 Uninstall 2020-01-05 00:01:00
8 Joey74 Reinstall 2020-01-30 00:01:00
9 Susane11 Reinstall 2020-01-04 00:02:00
函数结果: customerStatuses_df
username status1 status2 timeToUninstall timeToReinstall
0 Joey74 Reinstall Uninstall 349 days 23:49:00 NaN
1 Joey74 Uninstall Reinstall NaT 25 days 00:00:00
2 Sam22 Original Install Uninstall -14 days +00:01:00 NaN
我在这里错过了什么?
【问题讨论】:
-
你能解释一下那些for循环的逻辑吗
标签: python pandas loops date datetime