проверка pyspark, если ЧЧ: мм: сс находится в диапазоне - PullRequest
0 голосов
/ 12 марта 2019

У меня есть некоторые данные, которые выглядят так.

time
08:28:24
22:20:54 
12:59:38
21:46:07

Я хочу выбрать время, которое стоит между 16:00:00 и 23:59:59, это закрытый диапазон.

Что мне с этим делать?(Тип столбца «Время» - строка.)

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Ваше состояние может быть упрощено до проверки, находится ли часовая часть вашего столбца time между 16 и 23.

Вы можете получить час, используя pyspark.sql.functions.split, чтобы разбить столбец time на символ :. Извлеките токен с индексом 0, чтобы получить час, и проведите сравнение, используя pyspark.sql.Column.between() (включая границы).

from pyspark.sql.functions import split
df.where(split("time", ":")[0].between(16, 23)).show()
#+--------+
#|    time|
#+--------+
#|22:20:54|
#|21:46:07|
#+--------+

Обратите внимание, что даже если split возвращает строку, существует неявное преобразование в int для сравнения between.


Конечно, это можно расширить, если у вас есть более сложные критерии фильтрации, которые также включают просмотр минут или секунд:

df.select(
    "*",
    split("time", ":")[0].cast("int").alias("hour"),
    split("time", ":")[1].cast("int").alias("minute"),
    split("time", ":")[2].cast("int").alias("second")
).show()
#+--------+----+------+------+
#|    time|hour|minute|second|
#+--------+----+------+------+
#|08:28:24|   8|    28|    24|
#|22:20:54|  22|    20|    54|
#|12:59:38|  12|    59|    38|
#|21:46:07|  21|    46|     7|
#+--------+----+------+------+
0 голосов
/ 13 марта 2019

Вы можете использовать функцию столбца между при конвертации столбца.См. Пример с комментариями ниже:

import datetime
from pyspark.sql import functions as F
from pyspark.sql import types as T

#pyspark does not provide a type to hold time only values,
#therefore we have to work with the datetime format.
#When your string  only represents the time, pyspark will automatically add the current date.
#The filter expression we will use later for your range needs also the current date.
now = datetime.datetime.now().strftime("%Y-%m-%d")

l1 = [('08:28:24',)
    ,('22:20:54',)
    ,('12:59:38',)
    ,('21:46:07',)
    ,('16:00:00',)]

df = spark.createDataFrame(l1,['time'])
#Converting
df = df.withColumn('time', df.time.cast(T.TimestampType()))
#Applying your filter with the current date
df = df.filter(F.col("time").between(now + ' 16:00:00',now + ' 23:59:59'))

df.show()

Вывод:

+-------------------+ 
|               time|
+-------------------+
|2019-03-12 22:20:54| 
|2019-03-12 21:46:07| 
|2019-03-12 16:00:00| 
+-------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...