簡體   English   中英

在 Scala 中僅過濾特定格式的日期

[英]Filter only particular format of date in Scala

我有一個數據框,其中一些字段的日期格式為 D.HH:mm:ss、D.HH:mm:ss.SSSSSSS & HH:mm:ss.SSSSSSS。 我只需要過濾類型為 HH:mm:ss.SSSSSSS 的日期並將此日期轉換為秒(整數)。

我在下面寫了將日期轉換為秒的 Scala 代碼。 我需要幫助來過濾特定格式的日期類型(HH:mm:ss.SSSSSSS)並跳過數據框中的其他日期格式。 任何幫助,將不勝感激。

 def hoursToSeconds(a: Any): Int = {
  val sec = a.toString.split('.')
  val fields = sec(0).split(':')
  val creationSeconds = fields(0).toInt*3600 + fields(1).toInt*60 + fields(2).toInt
  return creationSeconds
}

任務可以分為兩部分:

  1. rlike的幫助下過濾所需的行
  2. 計算udf 中的秒數

創建一些測試數據:

val df = Seq(
   ("one", "1.09:39:26"),
   ("two", "1.09:39:26.1234567"),
   ("three", "09:39:26.1234567")
 ).toDF("info", "time")

regexp 和 udf 的定義:

val pattern = "\\A(\\d{1,2}):(\\d{2}):(\\d{2})\\.\\d{7}\\z".r

val toSeconds = udf{in: String => {
  val pattern(hour, minute, second) = in
  hour.toInt * 60 * 60 + minute.toInt * 60 + second.toInt
}}

實際代碼:

df
  .filter('time rlike pattern.regex)
  .select('info, 'time, toSeconds('time).as("seconds"))
  .show

印刷

+-----+----------------+-------+
| info|            time|seconds|
+-----+----------------+-------+
|three|09:39:26.1234567|  34766|
+-----+----------------+-------+

如果應保留格式不正確的行,則可以稍微更改 udf 並刪除過濾器:

val pattern = "\\A(\\d{1,2}):(\\d{2}):(\\d{2})\\.\\d{7}\\z".r

val toSeconds = udf{in: String => {
  in match {
    case pattern(hour, minute, second)=> hour.toInt * 60 * 60 + minute.toInt * 60 + second.toInt
    case _ => 0
  }
}}

df
  .select('info, 'time, toSeconds('time).as("seconds"))
  .show

印刷

+-----+------------------+-------+
| info|              time|seconds|
+-----+------------------+-------+
|  one|        1.09:39:26|      0|
|  two|1.09:39:26.1234567|      0|
|three|  09:39:26.1234567|  34766|
+-----+------------------+-------+

您可以嘗試使用正則表達式與提取器進行匹配,如下所示:

val dateRegex = """(\d{2}):(\d{2}):(\d{2}).(\d{7})""".r

val D_HH_mm_ss = "1.12:12:12"
val D_HH_mm_ss_SSSSSSS = "1.12:12:12.1234567"
val HH_mm_ss_SSSSSSS = "12:12:12.1234567"

val dates = List(HH_mm_ss_SSSSSSS, D_HH_mm_ss_SSSSSSS, D_HH_mm_ss)

dates.foreach {
  _ match {
    case dateRegex(hh, mm, ss, sssssssss) => println(s"Yay! $hh-$mm-$ss")
    case _ => println("Nay :(")
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM