2014-11-03 1 views
1

나는이 문제로 내 바퀴를 돌고 있었고 누군가가 그것에 접근하는 최선의 방법에 대한 통찰력이 있는지 궁금해하고있었습니다. 하나의 datetime64 [ns]를 포함하여 여러 개의 열이있는 팬더 DataFrame이 있습니다. 서로 아주 가까운 datetime을 가진 레코드를 그룹화하는 방법을 찾고 싶습니다. 예를 들어, 나는 그룹화 된 ID라는 공통의 ID를 할당하여 서로의 2 초 내에 발생하는 경우 함께 다음 트랜잭션을 그룹화에 관심이있을 수 있습니다 내가 찾고 있지 않다파이썬에서 가까운 DateTimes를 사용하여 레코드 그룹화 pandas DataFrame

Transaction ID Time Grouped ID 
    1   08:10:02  1 
    2   08:10:03  1 
    3   08:10:50 
    4   08:10:55 
    5   08:11:00  2 
    6   08:11:01  2 
    7   08:11:02  2 
    8   08:11:03  3 
    9   08:11:04  3 
    10   08:15:00 

참고 시간 창을 확장해야합니다 빠른 간격으로 트랜잭션이 계속 발생하면 광고는 무한합니다. 전체 2 초 창이 지나면 새 창은 다음 트랜잭션으로 시작됩니다 (트랜잭션 5 - 9에 표시된 것처럼). 또한이 분석은 궁극적으로 밀리 초 수준 (즉, 50 밀리 초 이내에 트랜잭션 결합)에서 수행되지만 위에 제시하기 쉽도록 초 단위로 고정됩니다.

당신이 제공 할 수있는 통찰력을 위해 대단히 감사합니다!

답변

2

내가 제안하는 해결책은 시간 데이터로 데이터를 다시 색인해야한다는 것입니다. 원하는 빈도로 날짜 시간 목록을 사용할 수 있습니다. searchsorted을 사용하여 색인에서 가장 가까운 날짜 시간을 찾은 다음 질문에 대답 (python pandas dataframe slicing by date conditionsPython pandas, how to truncate DatetimeIndex and fill missing data only in certain interval에서 제안 된대로)을 위해이를 사용합니다.

나는 팬더 0.14.1과 DataOffset 개체 (http://pandas.pydata.org/pandas-docs/dev/timeseries.html?highlight=dateoffset)를 사용하고 있습니다. datetime64로 확인하지는 않았지만 코드를 적용 할 수 있습니다. DataOffset은 마이크로 초 수준으로 떨어집니다.

      value Group id 
2014-11-03 00:00:00    0  0 
2014-11-03 00:00:00.001000  1  0 
2014-11-03 00:00:00.002000  2  0 
2014-11-03 00:00:00.003000  3  0 
2014-11-03 00:00:00.004000  4  0 
2014-11-03 00:00:00.005000  5  1 
2014-11-03 00:00:00.006000  6  1 
2014-11-03 00:00:00.007000  7  1 
2014-11-03 00:00:00.008000  8  1 
2014-11-03 00:00:00.009000  9  1 
2014-11-03 00:00:00.010000  10  2 
2014-11-03 00:00:00.011000  11  2 
2014-11-03 00:00:00.012000  12  2 
2014-11-03 00:00:00.013000  13  2 
2014-11-03 00:00:00.014000  14  2 
: 다음 코드를 사용하여

,

import pandas as pd 
import pandas.tseries.offsets as pto 
import numpy as np 

# Create some ome test data 
d_size = 15 
df = pd.DataFrame({"value": np.arange(d_size)}, index=pd.date_range("2014/11/03", periods=d_size, freq=pto.Milli())) 

# Define periods to define groups (ticks) 
ticks = pd.date_range("2014/11/03", periods=d_size/3, freq=5*pto.Milli()) 
# find nearest indexes matching the ticks 
index_ticks = np.unique(df.index.searchsorted(ticks)) 

# make a dataframe with the group ids 
dgroups = pa.DataFrame(index=df.index, columns=['Group id',]) 

# sets the group ids 
for i, (mini, maxi) in enumerate(zip(index_ticks[:-1], index_ticks[1:])): 
    dgroups.loc[mini:maxi] = i 

# update original dataframe 
df['Group id'] = dgroups['Group id'] 

나는 dataframe의이 종류를 얻을 수 있었다

관련 문제