2013-04-15 2 views
2

나는 날짜 그룹을 가지고 있습니다. 나는 그들 사이의 델타를 얻기 위해 앞으로 이웃에서 그들을 빼고 싶다. 내 코드는 다음과 같습니다.그룹화 된 이웃으로부터 팬더 시간 델타

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]) 

나는 꽤 이해할 수없는 결과를 얻고 있습니다. 그래서 나는 논리 오류가있다. I는 0과 1은 0 결과 모두 가지고 것이라고 exapme 위해 기다리고 있었다

       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 

다음과 같이 내가 할

결과입니다. 어떤 도움이라도 대단히 감사합니다.

+0

아마도 누군가에게 오류가 이해가되지 않을 수도 있습니다. 오류를 게시하면 더 많은 도움이 될 수 있습니다. – gustavodidomenico

+0

을 0.11.0rc1로 업그레이드하고 새 문서와이 조리법을 살펴보십시오. http://pandas.pydata.org/pandas-docs/dev/cookbook.html#miscellaneous, 0.10.1, timedeltas의 많은 좋은 변화 – Jeff

답변

4

이 (내가 이전 버전에서 작동합니다 생각하지 않습니다) 당신이 날짜를 이동하면 는 첫 번째는 NAT은 (a 유모처럼,하지만 날짜 시간/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 
0.11rc1에

다음 fillna 할 수 있습니다 (하지만 numpy 버그 때문에 ackward 형식 변환을 수행 할, 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]