第一数据帧(df):

start end
6:15:00 6:15:06
6:15:00 6:15:00
6:15:00 6:15:01
6:15:01 6:15:06
6:15:01 6:15:15
6:15:01 6:15:09
6:15:01 6:15:09
6:15:02 6:15:06
6:15:02 6:15:08
6:15:02 6:15:09

df2:

periods (1 sec timedelta) total
6:15:00 2
6:15:01 5
6:15:02 8

如何在不使用循环的情况下计算df2的总和?对于df2个周期中的每个周期,需要从df开始的行的和,前提是start <= periodend >= period (total).例如,df2 = x中的6:15:02:

from datetime import datetime, timedelta


x = datetime(year=2023,month=10, day=6, hour=6, minute=15, second=2).time()

df = pd.DataFrame({'start': ['6:15:00', '6:15:00', '6:15:00', '6:15:01', '6:15:01', '6:15:01', '6:15:01', '6:15:02', '6:15:02', '6:15:02'],
              'end': ['6:15:06', '6:15:00', '6:15:01', '6:15:06', '6:15:15', '6:15:09', '6:15:09', '6:15:06', '6:15:08', '6:15:09']})

df['start'] = pd.to_datetime(df['start'], yearfirst=True).dt.time
df['end'] = pd.to_datetime(df['end'], yearfirst=True).dt.time

start = datetime(year=2023,month=10, day=6, hour=6, minute=15, second=0)
end = datetime(year=2023,month=10, day=6, hour=6, minute=15, second=2)
df2 = pd.DataFrame({"periods (1 sec timedelta)": pd.date_range(start=start, end=end, freq=timedelta(seconds=1)), "total": None})
df2["periods (1 sec timedelta)"] = pd.to_datetime(df2["periods (1 sec timedelta)"], yearfirst=True).dt.time

total = len(df[(df['start'] <= x) & (df['end'] >= x)])

total=8.如果对df2中的每一行进行计算,则需要很长时间.有没有更有效的方法?

推荐答案

将Time Like Columns解析为timedelta数组,然后调用一个函数,该函数将返回满足给定条件的行数.这里的诀窍是用numba来编译函数,以达到与C语言类似的速度,而且由于您的数据帧很大,Numba将是提高效率和管理内存的理想方法

from numba import njit

@njit
def func(period, start, end):
    for p in period:
        mask = (start <= p) & (end >= p)
        yield sum(mask)


def to_timedelta_arr(col):
    return pd.to_timedelta(col.astype(str)).to_numpy()


df2['total'] = list(func(to_timedelta_arr(df2['periods (1 sec timedelta)']),
                         to_timedelta_arr(df['start']), to_timedelta_arr(df['end'])))

  periods (1 sec timedelta)  total
0                  06:15:00      3
1                  06:15:01      6
2                  06:15:02      8

Python-3.x相关问答推荐

是否可以使用参数对Flask重定向?

Python将类实例变量转换为嵌套 struct

如何绘制交叉验证的AUROC并找到最佳阈值?

如何在M x N数组的行中找到所有值的组合

当条件第一次出现时将行标记为True,如果按顺序重复则标记为False

我可以设置树视图层次 struct 按钮吗?

平移数组

缺失时推断的数据类可选字段

Python:如何在Pandas 的 .agg 函数中使用 value_counts()?

Python.在循环中填充字典的问题

如何将虚拟变量列转换为多列?

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

运行 PyCharm 测试时如何解决django.core.exceptions.ImproperlyConfigured:找不到 GDAL 库?

判断对 python 3 支持的要求

如何使用 asyncio 添加连接超时?

如何在 python 3.x 中禁用 ssl 判断?

如何遍历某些扩展名的文件?

每次启动 Google Colab 时都必须安装所需的软件包吗?

从 csv 中删除单行而不复制文件

如何在 Pandas 中的超 Big Data 框上创建数据透视表