2016-09-25 119 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中为不同的拉链()