【问题标题】:How can I convert a hour range to a total number of hours using SQL?如何使用 SQL 将小时范围转换为总小时数?
【发布时间】:2019-10-17 23:04:11
【问题描述】:

我目前正在使用 Yelp 的数据集,我的目标是找出一家企业每周营业的总小时数。从数据中,我能够提取某一天看起来像“9:0-0:0”或“17:30-21:30”的每一天的时间范围。如何使用 SQL 获取这些小时范围的单个值?

这是我用来在数据集中显示企业营业时间的一些代码。

df_busSelected = df_business.select("business_id", "name"
                   , "hours.Sunday", "hours.Monday", "hours.Tuesday"
                   ,"hours.Wednesday", "hours.Thursday", "hours.Friday"
                   , "hours.Saturday")
df_busSelected.show()

我希望在给定范围内创建一个新列,其中包含企业每周营业的总小时数。

【问题讨论】:

    标签: mysql sql pyspark databricks


    【解决方案1】:

    使用 pyspark,您可以执行以下操作:

    from pyspark.sql.functions import expr
    
    df.withColumn('h', expr('split(hours, "[-:]")').astype('array<int>')) \
      .withColumn('h1', expr('''
            h[2] - h[0] + IF(h[2]<h[0],24,0) + round((h[3]-h[1])/60,0)
       ''').astype('int')) \
      .show()
    +----------+-----------+----------------+---+
    |     bdate|      hours|               h| h1|
    +----------+-----------+----------------+---+
    |2019-10-17|    9:0-0:0|    [9, 0, 0, 0]| 15|
    |2019-10-18|17:30-21:30|[17, 30, 21, 30]|  4|
    +----------+-----------+----------------+---+
    

    首先使用字符集[-:] 将列hours 拆分为一个包含4 个项目的数组(命名为h)并将其转换为int 的数组(最初是StringType 的数组)

    然后进行简单的数学运算,最后将结果类型再次转换为int

    接下来,使用date_format('bdate', 'EEEE') 获取星期名称,然后使用groupbypivot 可能还有agg + sum 函数来获取最终结果

    【讨论】:

    • 嘿,我正在使用你给我的 expr(非常有帮助,谢谢),但我想知道为什么当我应用这个等式时,“h1”下的一些值被四舍五入,这是因为一轮((h [3]-h [1])?我也得到了几个小时的负值并且对此有些担心,请告诉我您是否可以帮助解决方程式部分!
    • @ChristineBui,您可以将数字转换为分钟并进行比我原来的方法更好的数学运算:((h[2] - h[0] + IF(h[2]&lt;h[0],24,0))*60 + h[3] - h[1])/60。对于否定的h1,很可能存在一些数据问题,只需检查数组字段h 应该有助于解决此问题。
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多