python 中的日期时间 - 计算速度 - 大数据

Datetime in python - speed of calculations - big data

我想找出数据框中两列之间的差异(以天为单位)(更具体地说是在 graphlab SFrame 数据结构中)。

我已经尝试编写几个函数来执行此操作,但我似乎无法创建足够快的函数。速度是我现在的问题,因为我有大约 8000 万行要处理。

我尝试了两种不同的功能,但都太慢了:

t2_colname_str 和 t1_colname_str 参数是我要使用的列名,两列都包含 datetime.datetime 个对象。

For循环

def diff_days(sframe_obj,t2_colname_str,t1_colname_str):
    import graphlab as gl
    import datetime as datetime

    # creating the new column name to be used later
    new_colname = str(t2_colname_str[:-9] + "_DiffDays_" + t1_colname_str[:-9])
    diff_days_list = []

    for i in range(len(sframe_obj[t2_colname_str])):
        t2 = sframe_obj[t2_colname_str][i]
        t1 = sframe_obj[t1_colname_str][i]
        try:
            diff = t2 - t1
            diff_days = diff.days
            diff_days_list.append(diff_days)
        except TypeError:
            diff_days_list.append(None)

    sframe_obj[new_colname] = gl.SArray(diff_days_list)

列表理解

我知道这不是列表理解的预期目的,但我只是试了一下,看看它是否更快。

def diff_days(sframe_obj,t2_colname_str,t1_colname_str):
    import graphlab as gl
    import datetime as datetime

    # creating the new column name to be used later
    new_colname = str(t2_colname_str[:-9] + "_DiffDays_" + t1_colname_str[:-9])

    diff_days_list = [(sframe_obj[t2_colname_str][i]-sframe_obj[t1_colname_str][i]).days if sframe_obj[t2_colname_str][i] and sframe_obj[t1_colname_str][i] != None else None for i in range(len(sframe_obj[t2_colname_str]))]

    sframe_obj[new_colname] = gl.SArray(diff_days_list)

补充说明

我一直在使用 Dato 的 GraphLab-Create 及其 SFrame 数据结构,主要是因为它并行化了所有计算,这使我的分析速度超快,并且它有一个很棒的机器学习应用程序库。如果您还没有检查过,那将是一个很棒的产品。

可在此处找到 GraphLab 用户指南:https://dato.com/learn/userguide/index.html

很高兴您找到了可行的方法,但是 SArray 允许向量运算,因此您不需要遍历列的每个元素。 SArrays 会迭代,但它们真的很慢。

遗憾的是,SArray 不支持日期时间类型的向量运算,因为它们不支持 "timedelta" 类型。你可以这样做:

diff = sframe_obj[t2_colname].astype(int) - sframe_obj[t1_colname].astype(int)

这会将列转换为 UNIX 时间戳,然后执行向量化差分运算,这应该非常快...至少比转换为 NumPy 快。