2015-11-26 3 views
1

У меня есть dataframe, который выглядит следующим образом:Resampling с даты начала и окончания столбцов

START_TIME END_TIME  TRIAL_No  itemnr 
2403950  2413067  Trial: 1  P14 
2413378  2422499  Trial: 2  P03 
2422814  2431931  Trial: 3  P13 
2432246  2441363  Trial: 4  P02 
2523540  2541257  Trial: 5  P11 
2541864  2560297  Trial: 6  P10 
2560916  2577249  Trial: 7  P05 

В таблице идет дальше и дальше, как это. START_TIME и END_TIME находятся в миллисекундах, которые являются временем начала и окончания пробной версии. Так что я хочу сделать, я хочу перепробовать START_TIME в 100milliseconds bin itme и интерполировать переменные (TRIAL_No и itemnr) между каждым START_TIME и END_TIME. Вне этих регионов эти переменные должны иметь значение «NA». Например, для первой строки START_TIME составляет 2403950, а END_TIME - 2413067. Разница между ними составляет 9117 миллисекунд. Таким образом, «Судебная: 1» остается на 9117 мсек, что составляет 91 бит, так как время каждого бина составляет 100 мсек. Поэтому я хочу повторить «Trial_1» и «P14» 91 раз в результирующем кадре данных. То же самое касается остальных. Мне нравится следующее:

Bin_time  TRIAL_No itemnr 
2403950  Trial: 1 P14 
2404050  Trial: 1 P14 
2404150  Trial: 1 P14 
      ... 
2413050  Trial: 1 P14 
2413150  Trial: 2 P03 
2413250  Trial: 2 P03 

и так далее. Я не уверен, что это возможно непосредственно в пандах или требуется некоторая предварительная обработка.

ответ

1

После создания нового фрейма данных на concat данных я могу сгруппировать по строкам и применить resample к каждой из этих групп (с помощью метода ffill для пересылки).

print df 
# START_TIME END_TIME TRIAL_No itemnr 
#0  2403950 2413067 Trial: 1 P14 
#1  2413378 2422499 Trial: 2 P03 
#2  2422814 2431931 Trial: 3 P13 
#3  2432246 2441363 Trial: 4 P02 
#4  2523540 2541257 Trial: 5 P11 
#5  2541864 2560297 Trial: 6 P10 
#6  2560916 2577249 Trial: 7 P05 

#PREDPROCESSING 
#helper column for matching start and end rows 
df['row'] = range(len(df)) 

#reshape to df - every row two times repeated for each date of START_TIME and END_TIME 
starts = df[['START_TIME','TRIAL_No','itemnr','row']].rename(columns={'START_TIME':'Bin_time'}) 
ends = df[['END_TIME','TRIAL_No','itemnr','row']].rename(columns={'END_TIME':'Bin_time'}) 
df = pd.concat([starts, ends]) 
df = df.set_index('row', drop=True) 
df = df.sort_index() 

#convert miliseconds to timedelta for resampling by time 100ms 
df['Bin_time'] = df['Bin_time'].astype('timedelta64[ms]') 
print df 
#   Bin_time TRIAL_No itemnr 
#row         
#0 00:40:03.950000 Trial: 1 P14 
#0 00:40:13.067000 Trial: 1 P14 
#1 00:40:13.378000 Trial: 2 P03 
#1 00:40:22.499000 Trial: 2 P03 
#2 00:40:22.814000 Trial: 3 P13 
#2 00:40:31.931000 Trial: 3 P13 
#3 00:40:32.246000 Trial: 4 P02 
#3 00:40:41.363000 Trial: 4 P02 
#4 00:42:03.540000 Trial: 5 P11 
#4 00:42:21.257000 Trial: 5 P11 
#5 00:42:21.864000 Trial: 6 P10 
#5 00:42:40.297000 Trial: 6 P10 
#6 00:42:40.916000 Trial: 7 P05 
#6 00:42:57.249000 Trial: 7 P05 

print df.dtypes 
#Bin_time timedelta64[ms] 
#TRIAL_No    object 
#itemnr    object 
#dtype: object 
#resample and fill missing data 
df = df.groupby(df.index).apply(lambda x: x.set_index('Bin_time').resample('100ms',how='first',fill_method='ffill')) 

df = df.reset_index() 
df = df.drop(['row'], axis=1) 

#convert timedelta to integer back 
df['Bin_time'] = (df['Bin_time']/np.timedelta64(1, 'ms')).astype(int) 

print df.head() 
# Bin_time TRIAL_No itemnr 
#0 2403950 Trial: 1 P14 
#1 2404050 Trial: 1 P14 
#2 2404150 Trial: 1 P14 
#3 2404250 Trial: 1 P14 
#4 2404350 Trial: 1 P14 

EDIT:

Если вы хотите получить NaN вне групп, вы можете изменить код после groupby:

#resample and fill missing data 
df = df.groupby(df.index).apply(lambda x: x.set_index('Bin_time').resample('100ms', how='first',fill_method='ffill')) 

#reset only first level - drop index row 
df = df.reset_index(level=0, drop=True) 
#resample by 100ms, outside are NaN 
df = df.resample('100ms', how='first') 
df = df.reset_index() 
#convert timedelta to integer back 
df['Bin_time'] = (df['Bin_time']/np.timedelta64(1, 'ms')).astype(int) 

print df 
+0

Спасибо. Это сработало. У меня есть другой вопрос в другом потоке, но никто, кажется, не отвечает мне. Поэтому, если у вас есть время, вы можете взглянуть на него. здесь [ссылка] (http://stackoverflow.com/questions/33898674/python-pandas-resampling) – Same

+0

Я принял это. Не забудьте посмотреть на мой другой вопрос. Здесь [ссылка] (http://stackoverflow.com/questions/33898674/python-pandas-resampling) – Same

+0

Спасибо вам дорого. – Same

Смежные вопросы