【问题标题】:Datetime in python - speed of calculations - big datapython中的日期时间-计算速度-大数据
【发布时间】:2016-03-23 17:17:01
【问题描述】:

我想找出数据框中两列之间的差异(以天为单位)(更具体地说,在 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

【问题讨论】:

  • 我在尝试获取您正在使用的 SFrame 时收到“拒绝访问”错误。 “所有人”都可以下载吗?我有兴趣玩它。

标签: python-2.7 datetime timedelta graphlab bigdata


【解决方案1】:

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

不幸的是,SArray 不支持对日期时间类型的向量操作,因为它们不支持“timedelta”类型。你可以这样做:

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

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

【讨论】:

  • 太棒了!!!!谢谢你。对于所有约 8000 万行,这是完美且超快的 >> 1.57 秒。 -----
  • 您可能会补充说,您必须将“差异”除以 86400(一天中的秒数)才能获得总天数差异。
猜你喜欢
  • 2014-07-31
  • 1970-01-01
  • 2014-05-22
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
  • 2020-08-25
相关资源
最近更新 更多