Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python groupby变换中的时间戳差异_Python_Pandas_Numpy_Timestamp_Split Apply Combine - Fatal编程技术网

Python groupby变换中的时间戳差异

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')}

我有一个带有整数索引、会话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')}).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