Pandas 如何将15分钟和10分钟的timeseries数据帧合并为30分钟

Pandas 如何将15分钟和10分钟的timeseries数据帧合并为30分钟,pandas,data-science,Pandas,Data Science,我的数据准备有问题,我有两个时间序列数据帧,我想合并成30分钟的间隔。 第一个数据集的时间间隔为10分钟,而其他数据集的时间间隔为15分钟,理想情况下,应该可以将此数据集合并为30分钟的时间间隔 我试过这个指南,但我似乎没能得到它,我想它只允许频率-‘H’和这个 预期结果如下: DF_MERGED TIME LEVELS_A LEVELS_B 0 0 1 1800 2.16, 2.16, 2.16 0,0 2

我的数据准备有问题,我有两个时间序列数据帧,我想合并成30分钟的间隔。 第一个数据集的时间间隔为10分钟,而其他数据集的时间间隔为15分钟,理想情况下,应该可以将此数据集合并为30分钟的时间间隔

我试过这个指南,但我似乎没能得到它,我想它只允许频率-‘H’和这个

预期结果如下:

DF_MERGED

    TIME    LEVELS_A             LEVELS_B
0   0   
1   1800    2.16, 2.16, 2.16       0,0        
2   3600    2.16, 2.16, 2.16       0,1
3   5400    2.16, 2.16, 2.16       1,0
4   7200    2.16, 2.16, 2.16       1,0
5   9000    2.16, 2.16, 2.16       0,0
所有的东西都已经被插补了,所以它不像任何“NaN”。另外,每三个级别有两个级别。如何将其与pd.Datframe合并

或者,我只是想得到每个条目的最大值,这样就可以

DF_MERGED_V2

    TIME    LEVELS_A             LEVELS_B
0   0   
1   1800    2.16                   0       
2   3600    2.16                   1
3   5400    2.16                   1
4   7200    2.16                   1
5   9000    2.16                   0

为了避免在聚合过程中可能会注意到的任何问题,我建议首先将时间列转换为实际日期时间。然后,您需要的是一个简单的分组操作

以下是我的建议:

加载数据:

a = '''TIME    LEVELS_A
0   0   0
1   900 0
2   1800    0
3   2700    0
4   3600    0
5   4500    0
'''
b = '''TIME    LEVELS_B
0   0   2.16
1   600 2.16
2   1200    2.12
3   1800    1.989382667
4   2400    1.989382667
5   3000    1.989382667
'''

df_a = pd.DataFrame.from_csv(io.StringIO(a), sep='\s+')
df_b = pd.DataFrame.from_csv(io.StringIO(b), sep='\s+')
解决方案

import datetime as dt
import pandas as pd

reference_date = dt.datetime(2019,1,1) # Arbitrary date used for reference
df_a.index = reference_date + df_a['TIME'].astype('timedelta64[s]')
df_b.index = reference_date + df_b['TIME'].astype('timedelta64[s]')

new_a = df_a['LEVELS_A'].groupby(pd.TimeGrouper(freq='30T')).apply(lambda x: x.tolist())
new_b = df_b['LEVELS_B'].groupby(pd.TimeGrouper(freq='30T')).apply(lambda x: x.tolist())

merged_df = pd.concat({'LEVELS_A': new_a, 'LEVELS_B': new_b}, axis = 1, sort=True)

merged_df.index = (merged_df.index - reference_date).seconds # Return to original Time format
输出:

       LEVELS_A     LEVELS_B
0       [0, 0]     [2.16, 2.16, 2.12]
1800    [0, 0]     [1.989, 1.989, 1.989]
3600    [0, 0]     NaN
旁注:

如果您只需要每个列表中的最大元素,请添加以下内容

merged_df.applymap(lambda x: max(x) if isinstance(x, list) else np.nan)
输出:

    LEVELS_A    LEVELS_B    
0       0       2.160000
1800    0       1.989383
3600    0       NaN

我不明白你是如何从你提供的数据中得出预期结果的。您能确认数字是否正确吗?@ecortazar这些只是样本值,先生,很抱歉造成混淆。我只想向大家展示一个示例数据集,先生,这确实适用于连接部分,但是值到处都是,我只需要三个值来表示级别A,两个值来表示级别B,或者可能只是得到三个值的最高位值,然后将其合并。我扩展了我的解决方案,以显示我正在进行的计算和得到的输出。我不确定造成问题的数据有什么不同。但这在级别A中仅返回2个值,在级别B中仅返回3个值
    LEVELS_A    LEVELS_B    
0       0       2.160000
1800    0       1.989383
3600    0       NaN