用数字和字符串重新采样时间序列的集合

问题描述 投票:0回答:1

我具有以下具有时间序列数据的数据框:

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(对于每个时间序列来说都是唯一的,可以将它们分开),一个类和每个时间戳的一些值。在实际数据集中,每个时间序列的长度为24h = 96 * 15分钟。我希望情况已经清楚,即使不是仅仅要求它,我也会提供进一步的解释。

现在,我想将采样率更改为10分钟,1小时等,并为value列使用平均值。目标是在计算出平均值后“删除”所有“过时”的行,因此我得到了相同的表(但较短)。我现在很难更好地解释这一点,所以让我知道是否还有任何不清楚的地方。

编辑:预期结果:

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尝试,但是它们都导致结果,该结果将忽略其中包含字符串的列。

将“时间”分组,计算“值”的平均值并相应地调整其余列的正确方法/代码是什么?

预先感谢您提供任何提示或理想的代码!

pandas datetime time-series pandas-groupby resampling
1个回答
0
投票

最后,我用困难的方式做了遍历数据。这种方法需要一段时间,但我找不到更好的解决方案:

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)

我偶然发现此问题,可以提供更快的解决方案,我很高兴学习!

© www.soinside.com 2019 - 2024. All rights reserved.