用数字和字符串重新采样时间序列集合
resampling collection of time series with numbers and strings
我有以下带有时间序列数据的数据框:
import pandas as pd
import numpy as np
test_dict = {'time': ['2018-01-01 00:00:00+00:00', '2018-01-01 00:15:00+00:00', '2018-01-01 00:30:00+00:00', '2018-01-01 00:45:00+00:00',
'2018-01-02 00:00:00+00:00', '2018-01-02 00:15:00+00:00', '2018-01-02 00:30:00+00:00', '2018-01-02 00:45:00+00:00',
'2018-01-01 00:00:00+00:00', '2018-01-01 00:15:00+00:00', '2018-01-01 00:30:00+00:00', '2018-01-01 00:45:00+00:00'],
'id_day': [1,1,1,1,2,2,2,2,1,1,1,1],
'name':['sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor2', 'sensor2', 'sensor2', 'sensor2'],
'id_unique': [1,1,1,1,2,2,2,2,3,3,3,3],
'class': ['type1', 'type1', 'type1', 'type1', 'type1', 'type1', 'type1', 'type1', 'type2', 'type2', 'type2', 'type2'],
'value': np.random.randint(5,25, size = 12)}
testframe = pd.DataFrame(test_dict)
testframe['time'] = pd.to_datetime(testframe['time'])
如您所见,有几个时间序列在彼此下面。每个时间序列都有一个 15 分钟的树苗率时间,一个 id_day,传感器的名称,一个 id_unique(每个时间序列都是唯一的,以便能够将它们分开),一个 class 和每个时间戳的一些值。在真实数据集中,每个时间序列的长度为 24h = 96*15 分钟。
我希望情况清楚,如果不只是要求,我会提供进一步的解释。
现在我想将采样率更改为 10 分钟、1 小时等,并使用列 value
的平均值。目标是在计算平均值后 "delete" 所有 "obsolete" 行,所以我最终得到相同的 table (但更短)。我现在很难更好地解释这一点,所以如果有任何不清楚的地方,请告诉我。
编辑:
预期结果:
result_dict = {'time': ['2018-01-01 00:15:00+00:00',
'2018-01-02 00:15:00+00:00',
'2018-01-01 00:15:00+00:00'],
'id_day': [1,2,1],
'name':['sensor1', 'sensor1', 'sensor2'],
'id_unique': [1,2,3],
'class': ['type1', 'type1', 'type2'],
'value': np.random.randint(5,25, size = 3)}
result = pd.DataFrame(result_dict)
result['time'] = pd.to_datetime(result['time'])
其中value
为平均值。在这种情况下,我将测试帧从 5 分钟重新采样到 15 分钟。
EDIT_END
我试过的是:
testframe.set_index('time').groupby(pd.Grouper(freq = '5Min')).mean()
和其他一些 groupby 尝试,但它们都导致结果,忽略其中包含字符串的列。
groupby "time" 的正确 approach/code 是什么,计算 "value" 的平均值并相应地调整其余列?
提前感谢您提供任何提示或最好是代码!
最后,我艰难地完成了它并循环遍历了数据。这种方法需要一段时间,但我找不到更好的解决方案:
df_resampled_dict = {'time' : list(), 'id_day' : list(), 'name' : list(), 'id_unique' : list(), 'classes' : list(), 'value' : list()}
for id_uni in df['id_unique'].unique():
df_temp = df.loc[df['id_unique'] == id_uni]
name = df_temp['name'].unique()
klasse = df_temp['classes'].unique()
id_day = df_temp['id_day'].unique()
df_temp = df_temp.groupby(pd.Grouper(freq = sampling_rate)).mean()
df_temp = df_temp.reset_index()
df_resampled_dict['value'].extend(df_temp['value'])
df_resampled_dict['classes'].extend([klasse[0]] * len(df_temp['value']))
df_resampled_dict['time'].extend(df_temp['time'])
df_resampled_dict['id_day'].extend([id_day[0]] * len(df_temp['value']))
df_resampled_dict['name'].extend([name[0]] * len(df_temp['value']))
df_resampled_dict['id_unique'].extend([id_uni] * len(df_temp['value']))
df_resampled = pd.DataFrame(df_resampled_dict)
有人偶然发现了这个问题,可以提供更快的解决方案,我很高兴学习!
我有以下带有时间序列数据的数据框:
import pandas as pd
import numpy as np
test_dict = {'time': ['2018-01-01 00:00:00+00:00', '2018-01-01 00:15:00+00:00', '2018-01-01 00:30:00+00:00', '2018-01-01 00:45:00+00:00',
'2018-01-02 00:00:00+00:00', '2018-01-02 00:15:00+00:00', '2018-01-02 00:30:00+00:00', '2018-01-02 00:45:00+00:00',
'2018-01-01 00:00:00+00:00', '2018-01-01 00:15:00+00:00', '2018-01-01 00:30:00+00:00', '2018-01-01 00:45:00+00:00'],
'id_day': [1,1,1,1,2,2,2,2,1,1,1,1],
'name':['sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor1', 'sensor2', 'sensor2', 'sensor2', 'sensor2'],
'id_unique': [1,1,1,1,2,2,2,2,3,3,3,3],
'class': ['type1', 'type1', 'type1', 'type1', 'type1', 'type1', 'type1', 'type1', 'type2', 'type2', 'type2', 'type2'],
'value': np.random.randint(5,25, size = 12)}
testframe = pd.DataFrame(test_dict)
testframe['time'] = pd.to_datetime(testframe['time'])
如您所见,有几个时间序列在彼此下面。每个时间序列都有一个 15 分钟的树苗率时间,一个 id_day,传感器的名称,一个 id_unique(每个时间序列都是唯一的,以便能够将它们分开),一个 class 和每个时间戳的一些值。在真实数据集中,每个时间序列的长度为 24h = 96*15 分钟。 我希望情况清楚,如果不只是要求,我会提供进一步的解释。
现在我想将采样率更改为 10 分钟、1 小时等,并使用列 value
的平均值。目标是在计算平均值后 "delete" 所有 "obsolete" 行,所以我最终得到相同的 table (但更短)。我现在很难更好地解释这一点,所以如果有任何不清楚的地方,请告诉我。
编辑: 预期结果:
result_dict = {'time': ['2018-01-01 00:15:00+00:00',
'2018-01-02 00:15:00+00:00',
'2018-01-01 00:15:00+00:00'],
'id_day': [1,2,1],
'name':['sensor1', 'sensor1', 'sensor2'],
'id_unique': [1,2,3],
'class': ['type1', 'type1', 'type2'],
'value': np.random.randint(5,25, size = 3)}
result = pd.DataFrame(result_dict)
result['time'] = pd.to_datetime(result['time'])
其中value
为平均值。在这种情况下,我将测试帧从 5 分钟重新采样到 15 分钟。
EDIT_END
我试过的是:
testframe.set_index('time').groupby(pd.Grouper(freq = '5Min')).mean()
和其他一些 groupby 尝试,但它们都导致结果,忽略其中包含字符串的列。
groupby "time" 的正确 approach/code 是什么,计算 "value" 的平均值并相应地调整其余列?
提前感谢您提供任何提示或最好是代码!
最后,我艰难地完成了它并循环遍历了数据。这种方法需要一段时间,但我找不到更好的解决方案:
df_resampled_dict = {'time' : list(), 'id_day' : list(), 'name' : list(), 'id_unique' : list(), 'classes' : list(), 'value' : list()}
for id_uni in df['id_unique'].unique():
df_temp = df.loc[df['id_unique'] == id_uni]
name = df_temp['name'].unique()
klasse = df_temp['classes'].unique()
id_day = df_temp['id_day'].unique()
df_temp = df_temp.groupby(pd.Grouper(freq = sampling_rate)).mean()
df_temp = df_temp.reset_index()
df_resampled_dict['value'].extend(df_temp['value'])
df_resampled_dict['classes'].extend([klasse[0]] * len(df_temp['value']))
df_resampled_dict['time'].extend(df_temp['time'])
df_resampled_dict['id_day'].extend([id_day[0]] * len(df_temp['value']))
df_resampled_dict['name'].extend([name[0]] * len(df_temp['value']))
df_resampled_dict['id_unique'].extend([id_uni] * len(df_temp['value']))
df_resampled = pd.DataFrame(df_resampled_dict)
有人偶然发现了这个问题,可以提供更快的解决方案,我很高兴学习!