使用给定的 timedelta 重新采样时间序列
Resampling timeseries with a given timedelta
我正在使用 Pandas 来构建和处理数据。这是我的数据框:
我想对时间序列数据进行重采样,并且对于每个 ID(此处命名为“3”),所有比特率得分,从开始到结束(beginning_time / end_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']})
给出:
我想要第一行:
第二行也一样..
所以目标是重新采样开始和结束时间之间的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()
但在这种情况下,它不起作用!有任何想法吗 ?非常感谢!
这应该可以解决问题
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 作为不同的 zip()
您可以使用 melt
with resample
- 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
...
...
我正在使用 Pandas 来构建和处理数据。这是我的数据框:
我想对时间序列数据进行重采样,并且对于每个 ID(此处命名为“3”),所有比特率得分,从开始到结束(beginning_time / end_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']})
给出:
我想要第一行:
第二行也一样.. 所以目标是重新采样开始和结束时间之间的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()
但在这种情况下,它不起作用!有任何想法吗 ?非常感谢!
这应该可以解决问题
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 作为不同的 zip()
您可以使用 melt
with resample
- 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
...
...