我需要查找给定星期之间的全年星期。
201824是一年一周的示例。这意味着2018年的第24周。
假设一年中有52周,则2018年的周周从201801开始,到201852结束。此后,它继续到201901。
如果开始周和结束周在同一年,则我可以找到两周之间的全年周的范围,如下所示
val range = udf((i: Int, j: Int) => (i to j).toArray)
上面的代码仅在同一年的起始周和结束周有效,例如201912-201917
如果起始周和结束周属于不同的年份,我该如何工作。
Example: 201849 - 201903
The above weeks should give the output as:
201849,201850,201851,201852,201901,201902,201903
最佳答案
好了,仍然有很多优化要做,但是对于一般的方向,您可以使用:
我在这里使用org.joda.time.format
,但java.time
也应该适合。
def rangeOfYearWeeks(weeksRange: String): Array[String] = {
try {
val left = weeksRange.split("-")(0).trim
val right = weeksRange.split("-")(1).trim
val leftPattern = s"${left.substring(0, 4)}-${left.substring(4)}"
val rightPattern = s"${right.substring(0, 4)}-${right.substring(4)}"
val fmt = DateTimeFormat.forPattern("yyyy-w")
val leftDate = fmt.parseDateTime(leftPattern)
val rightDate = fmt.parseDateTime(rightPattern)
//if (leftDate.isAfter(rightDate))
val weeksBetween = Weeks.weeksBetween(leftDate, rightDate).getWeeks
val dates = for (one <- 0 to weeksBetween) yield {
leftDate.plusWeeks(one)
}
val result: Array[String] = dates.map(date => fmt.print(date)).map(_.replaceAll("-", "")).toArray
result
} catch {
case e: Exception => Array.empty
}
}
例:
val dates = Seq("201849 - 201903", "201912 - 201917").toDF("col")
val weeks = udf((d: String) => rangeOfYearWeeks(d))
dates.select(weeks($"col")).show(false)
+-----------------------------------------------------+
|UDF(col) |
+-----------------------------------------------------+
|[201849, 201850, 201851, 201852, 20181, 20192, 20193]|
|[201912, 201913, 201914, 201915, 201916, 201917] |
+-----------------------------------------------------+
关于scala - Spark-查找2周之间的全年周的范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58015618/