2016-09-25 135 views
1

我正在使用熊貓來構造和處理數據。這是我的數據框:給定時間重採樣時間序列

enter image description here

我想要做的時間序列數據的重採樣,並有,每一個ID(這裏命名爲「3」),所有的比特率的分數,從開始到結束(beginning_time/時間結束)。例如,對於第一行,我希望擁有所有的秒數,從2016-07-08 02:17:42到2016-07-08 02:17:55,具有相同的比特率分數,並且具有相同的ID 。事情是這樣的:

例如,給定:

df = pd.DataFrame(
{'Id' : ['CODI126640013.ts', 'CODI126622312.ts'], 
'beginning_time':['2016-07-08 02:17:42', '2016-07-08 02:05:35'], 
'end_time' :['2016-07-08 02:17:55', '2016-07-08 02:26:11'], 
'bitrate': ['3750000', '3750000']}) 

這給:

enter image description here

而且我想爲第一行:

enter image description here

同樣的事情e後一行。 因此,客觀是重新採樣開始和結束時間之間的deltaTime,當然,比特率得分必須相同。

我想這樣的代碼:

df['new_beginning_time'] = pd.to_datetime(df['beginning_time']) 
df.set_index('new_beginning_time').groupby('Id', group_keys=False).apply(lambda df: df.resample('S').ffill()).reset_index() 

但在這種情況下,沒有工作!有任何想法嗎 ?非常感謝你 !

回答

1

您可以使用meltresample - 0.18.1 version of pandas

df.beginning_time = pd.to_datetime(df.beginning_time) 
df.end_time = pd.to_datetime(df.end_time) 
df = pd.melt(df, id_vars=['Id','bitrate'], value_name='dates').drop('variable', axis=1) 
df.set_index('dates', inplace=True) 
print(df) 
            Id bitrate 
dates           
2016-07-08 02:17:42 CODI126640013.ts 3750000 
2016-07-08 02:05:35 CODI126622312.ts 3750000 
2016-07-08 02:17:55 CODI126640013.ts 3750000 
2016-07-08 02:26:11 CODI126622312.ts 3750000 

print (df.groupby('Id').resample('1S').ffill()) 
                Id bitrate 
Id    dates           
CODI126622312.ts 2016-07-08 02:05:35 CODI126622312.ts 3750000 
       2016-07-08 02:05:36 CODI126622312.ts 3750000 
       2016-07-08 02:05:37 CODI126622312.ts 3750000 
       2016-07-08 02:05:38 CODI126622312.ts 3750000 
       2016-07-08 02:05:39 CODI126622312.ts 3750000 
       2016-07-08 02:05:40 CODI126622312.ts 3750000 
       2016-07-08 02:05:41 CODI126622312.ts 3750000 
       2016-07-08 02:05:42 CODI126622312.ts 3750000 
       2016-07-08 02:05:43 CODI126622312.ts 3750000 
       2016-07-08 02:05:44 CODI126622312.ts 3750000 
       2016-07-08 02:05:45 CODI126622312.ts 3750000 
       2016-07-08 02:05:46 CODI126622312.ts 3750000 
       2016-07-08 02:05:47 CODI126622312.ts 3750000 
       ... 
       ... 
1

這應該做的伎倆

all = [] 
for row in df.itertuples(): 
    time_range = pd.date_range(row.beginning_time, row.end_time, freq='1S') 
    all += (zip(time_range, [row.Id]*len(time_range), [row.bitrate]*len(time_range))) 
pd.DataFrame(all) 

In[209]: pd.DataFrame(all) 
Out[209]: 
         0     1  2 
0 2016-07-08 02:17:42 CODI126640013.ts 3750000 
1 2016-07-08 02:17:43 CODI126640013.ts 3750000 
2 2016-07-08 02:17:44 CODI126640013.ts 3750000 
3 2016-07-08 02:17:45 CODI126640013.ts 3750000 
4 2016-07-08 02:17:46 CODI126640013.ts 3750000 
5 2016-07-08 02:17:47 CODI126640013.ts 3750000 
6 2016-07-08 02:17:48 CODI126640013.ts 3750000 
7 2016-07-08 02:17:49 CODI126640013.ts 3750000 

編輯:我使用python 2.7,Python 3中爲不同的拉鍊()