【问题标题】:How to merge timeseries dataframes, 15 mins and 10 mins, into 30 mins如何将 15 分钟和 10 分钟的时间序列数据帧合并为 30 分钟
【发布时间】:2019-03-29 10:02:05
【问题描述】:

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

我尝试了指南here,但我似乎无法得到它,我认为它只允许频率 - 'H' 和这个 SO question

DF_A

    TIME    LEVELS_A
0   0   0
1   900 0
2   1800    0
3   2700    0
4   3600    0
5   4500    0


DF_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_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”。此外,每三个 LEVELS_A 就有两个 LEVELS_B。这应该如何与 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

我想用 pandas 以编程方式做到这一点

【问题讨论】:

  • 我不明白您如何从您提供的数据中获得预期的结果数字。你能验证数字是否正确吗?
  • @ecortazar 这些只是样本值先生,抱歉造成混淆。我只想展示一个要合并的示例数据集

标签: pandas data-science


【解决方案1】:

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

这是我的建议:

加载数据:

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

【讨论】:

  • 太棒了,先生,这确实适用于串联部分prntscr.com/n4lfpn,但是值到处都是,我只需要 LEVELS_A 的三个值和 LEVELS_B 的两个值,或者也许只是获得最高值三者中的一者,然后将两者合并。
  • 我已经扩展了我的解决方案以显示我正在做的计算和我得到的输出。我不确定造成问题的数据有什么区别。但这仅返回 LEVEL A 中的 2 个值和 LEVEL B 中的 3 个值
猜你喜欢
  • 2021-12-02
  • 2021-01-08
  • 1970-01-01
  • 2021-07-18
  • 2017-08-26
  • 2015-03-10
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多