我的数据准备有问题,我有两个时间序列数据帧,我想合并为30分钟的间隔。 第一个数据集的间隔为10分钟,而其他数据集的间隔为15分钟,理想情况下,应该可以将其合并以形成30分钟的间隔DF
我尝试了指南here,但似乎无法理解,我认为它只允许使用频率-'H'和此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
我想通过编程方式对熊猫进行
答案 0 :(得分:1)
为了避免在聚合过程中可能不会引起注意的任何问题,建议您先将time列转换为实际的日期时间。然后,这就是您要查找的简单的按操作分组。
这是我的建议:
加载数据:
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