Python 在Datetime上合并两个数据集
我有两个数据集: 第一个包含注册过程开始时的数据,第二个包含注册过程结束时的数据。我有用户ID和日期 第一个示例(注册过程的开始): 用户ID时间 1111111 2016-01-26 13:02:22 1111111 2016-01-26 14:05:51 1111111 2016-01-26 14:58:08 1111111 2016-01-27 11:17:09 1111111 2016-01-27 12:05:17 1111111 2016-01-27 13:15:33 1111111 2016-01-27 18:10:12 1111111 2016-01-27 20:23:38 222222 2016-01-29 09:01:00 222222 2016-01-29 09:04:15 222222 2016-01-29 11:27:35 222222 2016-01-30 09:02:36 222222 2016-06-29 08:50:02 333333 2016-01-26 09:58:27 第二个(注册过程结束): 用户ID时间 1111111 2016-01-26 13:37:54 1111111 2016-01-26 14:40:34 1111111 2016-01-26 15:21:53 1111111 2016-01-27 11:42:58 1111111 2016-01-27 12:43:52 1111111 2016-01-27 13:39:56 1111111 2016-01-27 18:41:01 1111111 2016-01-27 20:51:56 222222 2016-01-29 09:17:26 222222 2016-01-29 11:37:10 222222 2016-01-30 09:16:33 333333 2016-01-29 09:14:39 我需要计算用户完成注册过程所需的时间。问题是,第一个数据集的行数比第二个数据集的行数多得多,因为用户可能会启动该过程,然后放弃它,所以我不能只在索引上进行合并。例如。: 两个开端: 222222 2016-01-29 09:01:00 222222 2016-01-29 09:04:15 222222 2016-01-29 09:01:00 222222 2016-01-29 09:04:15 只有一端: 222222 2016-01-29 09:17:26 222222 2016-01-29 09:17:26Python 在Datetime上合并两个数据集,python,pandas,datetime,Python,Pandas,Datetime,我有两个数据集: 第一个包含注册过程开始时的数据,第二个包含注册过程结束时的数据。我有用户ID和日期 第一个示例(注册过程的开始): 用户ID时间 1111111 2016-01-26 13:02:22 1111111 2016-01-26 14:05:51 1111111 2016-01-26 14:58:08 1111111 2016-01-27 11:17:09 1111111 2016-01-27 12:05:17 1111111 2016-01-27 13:15:33 1111111
使用merge/merge\u asof函数有什么好方法吗?IIUUC,您可以使用
merge\u asof
。这将允许您在与'User ID'
和日期完全匹配的情况下加入两个数据帧,然后您可以在结束数据帧(df_End
)中选择在开始数据帧(df_beg
)中的时间之后的最近时间
合并
现在是:
User ID Time_start Time_end
0 333333 2016-01-26 09:58:27 NaT
1 1111111 2016-01-26 13:02:22 2016-01-26 13:37:54
2 1111111 2016-01-26 14:05:51 2016-01-26 14:40:34
3 1111111 2016-01-26 14:58:08 2016-01-26 15:21:53
4 1111111 2016-01-27 11:17:09 2016-01-27 11:42:58
5 1111111 2016-01-27 12:05:17 2016-01-27 12:43:52
6 1111111 2016-01-27 13:15:33 2016-01-27 13:39:56
7 1111111 2016-01-27 18:10:12 2016-01-27 18:41:01
8 1111111 2016-01-27 20:23:38 2016-01-27 20:51:56
9 222222 2016-01-29 09:01:00 2016-01-29 09:17:26
10 222222 2016-01-29 09:04:15 2016-01-29 09:17:26
11 222222 2016-01-29 11:27:35 2016-01-29 11:37:10
12 222222 2016-01-30 09:02:36 2016-01-30 09:16:33
13 222222 2016-06-29 08:50:02 NaT
如果您需要按照注释中的指示计算平均时间,则由于
timedelta64
数据类型,您需要跳过几个环
import numpy as np
mask = merged.Time_end.notnull()
# Calculate the time difference and convert to a numeric type
merged.loc[mask, 'Time_diff'] = (merged.loc[mask, 'Time_end']
- merged.loc[mask, 'Time_start']).astype(np.int64)
# Calculate the average time difference, convert back to timedelta.
pd.to_timedelta(merged.groupby('User ID').Time_diff.mean())
#User ID
#222222 00:13:17.250000
#333333 NaT
#1111111 00:30:14.250000
#Name: Time_diff, dtype: timedelta64[ns]
所以你的例子中哪一个应该被忽略?你能提供更多关于数据帧的信息以及它们的含义吗?例如,列名、您试图实现的目标等?请参见此处,了解如何创建报告API,这是我从报告API获得的事件列表。第一个数据集显示注册过程的开始,第二个数据集显示注册过程的结束。我需要计算平均时差。我希望我已经澄清了我的问题。您可以在pandas中使用merge函数,并使用left join从右侧获取匹配行,从左侧获取所有行。下面是代码示例。df1.merge(df2,how='left',left_在='Column1'上,right_在='ColumnA'上)
import pandas as pd
# Need to convert to datetime and sort the keys we will merge_asof on.
df_beg['Time'] = pd.to_datetime(df_beg.Time)
df_end['Time'] = pd.to_datetime(df_end.Time)
df_beg = df_beg.sort_values('Time').rename(columns={'Time': 'Time_start'})
df_end = df_end.sort_values('Time').rename(columns={'Time': 'Time_end'})
merged = pd.merge_asof(df_beg, df_end,
left_by=['User ID', df_beg.Time_start.dt.date],
right_by=['User ID', df_end.Time_end.dt.date],
left_on='Time_start', right_on='Time_end',
direction='forward').drop(columns='key_1)
User ID Time_start Time_end
0 333333 2016-01-26 09:58:27 NaT
1 1111111 2016-01-26 13:02:22 2016-01-26 13:37:54
2 1111111 2016-01-26 14:05:51 2016-01-26 14:40:34
3 1111111 2016-01-26 14:58:08 2016-01-26 15:21:53
4 1111111 2016-01-27 11:17:09 2016-01-27 11:42:58
5 1111111 2016-01-27 12:05:17 2016-01-27 12:43:52
6 1111111 2016-01-27 13:15:33 2016-01-27 13:39:56
7 1111111 2016-01-27 18:10:12 2016-01-27 18:41:01
8 1111111 2016-01-27 20:23:38 2016-01-27 20:51:56
9 222222 2016-01-29 09:01:00 2016-01-29 09:17:26
10 222222 2016-01-29 09:04:15 2016-01-29 09:17:26
11 222222 2016-01-29 11:27:35 2016-01-29 11:37:10
12 222222 2016-01-30 09:02:36 2016-01-30 09:16:33
13 222222 2016-06-29 08:50:02 NaT
import numpy as np
mask = merged.Time_end.notnull()
# Calculate the time difference and convert to a numeric type
merged.loc[mask, 'Time_diff'] = (merged.loc[mask, 'Time_end']
- merged.loc[mask, 'Time_start']).astype(np.int64)
# Calculate the average time difference, convert back to timedelta.
pd.to_timedelta(merged.groupby('User ID').Time_diff.mean())
#User ID
#222222 00:13:17.250000
#333333 NaT
#1111111 00:30:14.250000
#Name: Time_diff, dtype: timedelta64[ns]