python - Pandas:将数据从列添加到另一个数据帧,直到特定时间结束

标签 python pandas dataframe datetime

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/

相关文章:

r - 按组拆分列

python - 默认情况下如何打开交互式python控制台?

python - Django ArrayField null=使用 Postgresql 的真正迁移

python - 值错误: The shape of all parameters

python - 更改 pandas boxplot 子图中各个框的颜色

r - 给定行中大于 0 的列值数?

python - 如何使用排序的数字索引和 pandas 中的重复项迭代数据框的唯一行的列值?

python - 从 numpy 中的 (n)D 数组中选择 (n-1)D 数组

Python:创建后卡住字典键

python - 如何在多索引数据帧中选择数据并使结果数据帧具有适当的索引