Python groupby变换中的时间戳差异
我有一个带有整数索引、会话id、事件和时间戳的数据帧,如下所示:Python groupby变换中的时间戳差异,python,pandas,numpy,timestamp,split-apply-combine,Python,Pandas,Numpy,Timestamp,Split Apply Combine,我有一个带有整数索引、会话id、事件和时间戳的数据帧,如下所示: In [41]: df = pd.DataFrame(data={'session_id': np.sort(np.random.choice(np.arange(3), 11)), 'event': np.random.choice(['A', 'B', 'C', 'D'], 11), 'time_stamp': pd.date_range ...: ('1/1/2017', periods=11, freq='S')}
In [41]: df = pd.DataFrame(data={'session_id': np.sort(np.random.choice(np.arange(3), 11)), 'event': np.random.choice(['A', 'B', 'C', 'D'], 11), 'time_stamp': pd.date_range
...: ('1/1/2017', periods=11, freq='S')}).reset_index(drop=True)
In [42]: df
Out[42]:
event session_id time_stamp
0 B 0 2017-01-01 00:00:00
1 C 0 2017-01-01 00:00:01
2 D 0 2017-01-01 00:00:02
3 B 1 2017-01-01 00:00:03
4 B 1 2017-01-01 00:00:04
5 D 2 2017-01-01 00:00:05
6 B 2 2017-01-01 00:00:06
7 A 2 2017-01-01 00:00:07
8 B 2 2017-01-01 00:00:08
9 B 2 2017-01-01 00:00:09
10 A 2 2017-01-01 00:00:10
我想使用groupby
by和lambda
函数计算会话长度,但我想返回一个与原始数据帧索引相同的序列对象,以便将其添加为列。类似这样的groupby.transform
应该可以实现这一点,但它会返回一个奇怪的“无法将对象转换为numpy datetime”错误:
你能解释一下这是不是一个bug吗?如果不是,我做错了什么?谢谢
p、 s.不想使用时间戳索引,因为实际数据中可能有重复的时间戳。为什么
agg
可以工作,但转换失败?
这两种行为之间的区别在于transform()
操作需要返回一个类似的索引。为了便于实现这一点,transform
从原始序列的副本开始。然后,在对每个组进行计算后,将复制序列的相应元素设置为结果。此时is进行类型比较,发现timedelta
不能转换为datetime
agg()
不执行此步骤,因此不会使类型检查失败
解决方案:
这一分析提出了一个解决办法。如果转换的结果是日期时间
,则转换将成功。因此,要解决以下问题:
base_time = df['time_stamp'][0]
df.groupby('session_id')['time_stamp'].transform(
lambda x: x.max() - x.min() + base_time) - base_time
这是一个Bug吗?
我假设这是一个bug,我计划在早上提交一个问题。我将在这里更新问题链接
更新:
我已为此问题提交了a和a。PR已合并,修复程序应为0.20.0
。
In [43]: df.groupby('session_id')['time_stamp'].agg(lambda x: x.max() - x.min())
Out[43]:
session_id
0 00:00:02
1 00:00:01
2 00:00:05
Name: time_stamp, dtype: timedelta64[ns]
base_time = df['time_stamp'][0]
df.groupby('session_id')['time_stamp'].transform(
lambda x: x.max() - x.min() + base_time) - base_time