来自分组邻居的熊猫时间增量

时间:2013-04-15 19:48:14

标签: python pandas

我有一组约会。我想从他们的前邻居中减去他们以获得他们之间的差异。我的代码看起来像这样:

import pandas, numpy, StringIO


txt = '''ID,DATE
002691c9cec109e64558848f1358ac16,2003-08-13 00:00:00
002691c9cec109e64558848f1358ac16,2003-08-13 00:00:00
0088f218a1f00e0fe1b94919dc68ec33,2006-05-07 00:00:00
0088f218a1f00e0fe1b94919dc68ec33,2006-06-03 00:00:00
00d34668025906d55ae2e529615f530a,2006-03-09 00:00:00
00d34668025906d55ae2e529615f530a,2006-03-09 00:00:00
0101d3286dfbd58642a7527ecbddb92e,2007-10-13 00:00:00
0101d3286dfbd58642a7527ecbddb92e,2007-10-27 00:00:00
0103bd73af66e5a44f7867c0bb2203cc,2001-02-01 00:00:00
0103bd73af66e5a44f7867c0bb2203cc,2008-01-20 00:00:00
'''
df = pandas.read_csv(StringIO.StringIO(txt))
df = df.sort('DATE')
df.DATE = pandas.to_datetime(df.DATE)
grouped = df.groupby('ID')
df['X_SEQUENCE_GAP'] = pandas.concat([g['DATE'].sub(g['DATE'].shift(), fill_value=0) for title,g in grouped])

我的结果非常难以理解。所以,我将继续我有一个逻辑错误。

我得到的结果如下:

                               ID                DATE       X_SEQUENCE_GAP
0  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00 12277 days, 00:00:00
1  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00             00:00:00
3  0088f218a1f00e0fe1b94919dc68ec33 2006-06-03 00:00:00    27 days, 00:00:00
2  0088f218a1f00e0fe1b94919dc68ec33 2006-05-07 00:00:00 13275 days, 00:00:00
5  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00 13216 days, 00:00:00
4  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00             00:00:00
6  0101d3286dfbd58642a7527ecbddb92e 2007-10-13 00:00:00 13799 days, 00:00:00
7  0101d3286dfbd58642a7527ecbddb92e 2007-10-27 00:00:00    14 days, 00:00:00
9  0103bd73af66e5a44f7867c0bb2203cc 2008-01-20 00:00:00  2544 days, 00:00:00
8  0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 00:00:00 11354 days, 00:00:00 

我期待exapme 0和1都有0结果。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

这是在0.11rc1(我认为不适用于以前的版本) 当您转移日期时,第一个是NaT(如nan,但是对于datetimes / timedeltas)

In [27]: df['X_SEQUENCE_GAP'] = grouped.apply(lambda g: g['DATE']-g['DATE'].shift())

In [30]: df.sort()
Out[30]: 
                                 ID                DATE      X_SEQUENCE_GAP
0  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00                 NaT
1  002691c9cec109e64558848f1358ac16 2003-08-13 00:00:00            00:00:00
2  0088f218a1f00e0fe1b94919dc68ec33 2006-05-07 00:00:00                 NaT
3  0088f218a1f00e0fe1b94919dc68ec33 2006-06-03 00:00:00   27 days, 00:00:00
4  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00                 NaT
5  00d34668025906d55ae2e529615f530a 2006-03-09 00:00:00            00:00:00
6  0101d3286dfbd58642a7527ecbddb92e 2007-10-13 00:00:00                 NaT
7  0101d3286dfbd58642a7527ecbddb92e 2007-10-27 00:00:00   14 days, 00:00:00
8  0103bd73af66e5a44f7867c0bb2203cc 2001-02-01 00:00:00                 NaT
9  0103bd73af66e5a44f7867c0bb2203cc 2008-01-20 00:00:00 2544 days, 00:00:00

然后你可以填充(但你必须做这个ackward类型的转换因为一个numpy bug,将在0.12中得到修复)。

 In [57]: df['X_SEQUENCE_GAP'].sort_index().astype('timedelta64[ns]').fillna(0)
Out[57]: 
0              00:00:00
1              00:00:00
2              00:00:00
3     27 days, 00:00:00
4              00:00:00
5              00:00:00
6              00:00:00
7     14 days, 00:00:00
8              00:00:00
9   2544 days, 00:00:00
Name: X_SEQUENCE_GAP, dtype: timedelta64[ns]