2014-11-03 16 views
1

我一直在旋轉我的輪子,並想知道是否有人對如何最好地接近它有任何的見解。我有一個有很多列的熊貓數據框,包括一個datetime64 [ns]。我想找到某種方式將具有非常接近的日期時間的記錄「組合」在一起。例如,我可能有興趣通過分配稱爲分組ID的共用ID分組以下交易在一起,如果他們發生相互的兩秒鐘之內:用Python中的關閉日期時間對熊貓進行分組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下降到微秒級別。

使用下面的代碼,

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

我能夠得到這樣的數據幀的:

      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