df1 如下所示,
A time
0 32 2023-09-30 08:00:00
1 18 2023-09-30 08:01:00
2 61 2023-09-30 08:02:00
3 87 2023-09-30 08:03:00
4 46 2023-09-30 08:04:00
5 18 2023-09-30 08:05:00
6 65 2023-09-30 08:06:00
7 18 2023-09-30 08:07:00
8 10 2023-09-30 08:08:00
9 93 2023-09-30 08:09:00
df2 如下所示,
AA BB Timestamp
0 27 54 2023-10-03 11:57:57.898397
1 28 56 2023-10-03 11:57:59.398397
2 29 58 2023-10-03 11:58:00.898397
3 30 60 2023-10-03 11:58:02.398397
4 31 62 2023-10-03 11:58:03.898397
5 32 64 2023-10-03 11:58:05.398397
6 33 66 2023-10-03 11:58:06.898397
7 34 68 2023-10-03 11:58:08.398397
8 35 70 2023-10-03 11:59:04.398397
我想将 df1 到 df2 的 A 数据添加到名为 CC 的新列中。
我将提供 df1 数据的下限和上限以供考虑。由于 df1 有 7 分钟的数据,df2 有 2 分钟的数据,因此我将指定一个日期时间范围,例如 2023-09-30 08:02:00 到 2023-09-30 08:08:00。
我想从下界开始将 df1 中的“A”数据添加到 df2 中,并继续添加“A”数据,直到 df2 填满。如果 df2 中完成了 1 分钟,我想转到 df1 中的下一个条目,这就是我想要填充 CC 的方式。
输出应该是这样的,
AA BB Timestamp CC
0 27 54 2023-10-03 11:57:57.898397 61
1 28 56 2023-10-03 11:57:59.398397 61
2 29 58 2023-10-03 11:58:00.898397 87
3 30 60 2023-10-03 11:58:02.398397 87
4 31 62 2023-10-03 11:58:12.898397 87
5 32 64 2023-10-03 11:58:24.398397 87
6 33 66 2023-10-03 11:58:40.898397 87
7 34 68 2023-10-03 11:58:52.398397 87
8 35 70 2023-10-03 11:59:04.398397 46
这里我给出的所有示例都是综合示例,通常在我的例子中,df1 在最小频率范围内有 10500 行数据,跨度为一周,而 df2 在毫秒频率范围内有 472963 行数据,跨度为 20 小时。任何帮助将不胜感激。
最佳答案
如果我理解正确的话,你可以定义一个 cumsum
来自您的引用值(或 df2 的第一个值)的 delta 并将其用作 merge_asof
的键:
start = pd.Timestamp('2023-09-30 08:02:00')
out = pd.merge_asof(df2.assign(delta=df2['Timestamp'].sub(df2['Timestamp'].iloc[0]).cumsum()),
df1.assign(delta=df1['time'].sub(start).where(lambda x: x>='0').cumsum())
.dropna(subset=['delta']).rename(columns={'A': 'CC'}),
on='delta', direction='forward'
).drop(columns=['delta', 'time'])
输出:
AA BB Timestamp CC
0 27 54 2023-10-03 11:57:57.898397 61
1 28 56 2023-10-03 11:57:59.398397 87
2 29 58 2023-10-03 11:58:00.898397 87
3 30 60 2023-10-03 11:58:02.398397 87
4 31 62 2023-10-03 11:58:03.898397 87
5 32 64 2023-10-03 11:58:05.398397 87
6 33 66 2023-10-03 11:58:06.898397 87
7 34 68 2023-10-03 11:58:08.398397 87
8 35 70 2023-10-03 11:59:04.398397 46
中间体:
AA BB Timestamp delta2 A time delta1
0 27 54 2023-10-03 11:57:57.898397 0 days 00:00:00 61 2023-09-30 08:02:00 0 days 00:00:00
1 28 56 2023-10-03 11:57:59.398397 0 days 00:00:01.500000 87 2023-09-30 08:03:00 0 days 00:01:00
2 29 58 2023-10-03 11:58:00.898397 0 days 00:00:04.500000 87 2023-09-30 08:03:00 0 days 00:01:00
3 30 60 2023-10-03 11:58:02.398397 0 days 00:00:09 87 2023-09-30 08:03:00 0 days 00:01:00
4 31 62 2023-10-03 11:58:03.898397 0 days 00:00:15 87 2023-09-30 08:03:00 0 days 00:01:00
5 32 64 2023-10-03 11:58:05.398397 0 days 00:00:22.500000 87 2023-09-30 08:03:00 0 days 00:01:00
6 33 66 2023-10-03 11:58:06.898397 0 days 00:00:31.500000 87 2023-09-30 08:03:00 0 days 00:01:00
7 34 68 2023-10-03 11:58:08.398397 0 days 00:00:42 87 2023-09-30 08:03:00 0 days 00:01:00
8 35 70 2023-10-03 11:59:04.398397 0 days 00:01:48.500000 46 2023-09-30 08:04:00 0 days 00:03:00
关于python - Pandas:将数据从列添加到另一个数据帧,直到特定时间结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77220345/