gpt4 book ai didi

python - 计算日期之间的天数,使用 pyspark 忽略周末

转载 作者:行者123 更新时间:2023-12-04 08:51:07 27 4
gpt4 key购买 nike

如何使用 pyspark 计算两个日期之间的天数而忽略周末?
这是与 here 完全相同的问题,只有我需要用 pyspark 来做这件事.
我尝试使用 udf :

import numpy as np
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType

@udf(returnType=IntegerType())
def dateDiffWeekdays(end, start):
return int(np.busday_count(start, end)) # numpy returns an `numpy.int64` type.

使用此 udf 时,我收到一条错误消息:

ModuleNotFoundError: No module named 'numpy'


有谁知道如何解决这个问题?或者更好的是,在没有 udf 的情况下解决这个问题在本地 pyspark ?
编辑 : 我有 numpy安装。外面的一个 udf它工作得很好。

最佳答案

对于 Spark 2.4+,可以在不使用 numpy 或 udf 的情况下获得天数。使用内置 SQL functions足够了。
大致如下this answer我们可以

  • 使用 sequence 创建一个包含开始和结束之间所有天数的日期数组
  • transform将单天转换为一个结构体,其中包含一天及其星期几值
  • filter排除周六和周日
  • 获取 size剩余数组的

  • #create an array containing all days between begin and end
    (df.withColumn('days', F.expr('sequence(begin, end, interval 1 day)'))
    #keep only days where day of week (dow) <= 5 (Friday)
    .withColumn('weekdays', F.expr('filter(transform(days, day->(day, extract(dow_iso from day))), day -> day.col2 <=5).day'))
    #count how many days are left
    .withColumn('no_of_weekdays', F.expr('size(weekdays)'))
    #drop the intermediate columns
    .select('begin', 'end', 'no_of_weekdays')
    .show(truncate=False))
    输出:
    +----------+----------+--------------+
    |begin |end |no_of_weekdays|
    +----------+----------+--------------+
    |2020-09-19|2020-09-20|0 |
    |2020-09-21|2020-09-24|4 |
    |2020-09-21|2020-09-25|5 |
    |2020-09-21|2020-09-26|5 |
    |2020-09-21|2020-10-02|10 |
    |2020-09-19|2020-10-03|10 |
    +----------+----------+--------------+

    对于 Spark <= 2.3,您必须使用 udf。如果 numpy 是一个问题,一个受此启发的解决方案 answer可以使用。
    from datetime import timedelta
    @F.udf
    def dateDiffWeekdays(end, start):
    daygenerator = (start + timedelta(x) for x in range((end - start).days + 1))
    return sum(1 for day in daygenerator if day.isoweekday() <= 5)

    df.withColumn("no_of_weekdays", dateDiffWeekdays(df.end, df.begin)).show()

    关于python - 计算日期之间的天数,使用 pyspark 忽略周末,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64101379/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com