Scala 使用外部 val 生成时间序列数据
Scala generating time series data using external val
我尝试从 start_time 生成 Array/List 数据,所以我的代码是
var temp = parse_time
// for (i <- 1 to 10) yield temp.plusSeconds(600) // method 1
val max = 10
Range (0, max).map( _ => (temp.plusSeconds(600))) // method 2
这两种方法都将产生相同的结果,数组中的数据没有任何增量变化。
谁能帮我弄清楚为什么以及如何解决它?
如果您想从上一个条目生成下一个条目(从 temp
开始),请尝试 List.iterate
:
List.iterate(temp, max)(_.plusSeconds(600))
这是它对整数的作用:
List.iterate(42, 10)(_ + 600)
产生:
List(42, 642, 1242, 1842, 2442, 3042, 3642, 4242, 4842, 5442)
这是另一个 java.time.LocalDateTime
的例子:
List.iterate(LocalDateTime.now(), 10)(_.plusSeconds(600)) foreach println
输出:
2018-06-27T12:52:53.237
2018-06-27T13:02:53.237
2018-06-27T13:12:53.237
2018-06-27T13:22:53.237
2018-06-27T13:32:53.237
2018-06-27T13:42:53.237
2018-06-27T13:52:53.237
2018-06-27T14:02:53.237
2018-06-27T14:12:53.237
2018-06-27T14:22:53.237
List.tabulate(max)(i => temp.plusSeconds(600 * i))
因为 .plusSeconds
产生了一个新值而不是改变原始值,所以你得到的所有结果加上 600。
这里是示例 LocalDateTime
或 OffsetDateTime
scala> import java.time.LocalDateTime
import java.time.LocalDateTime
scala> val temp = LocalDateTime.now
temp: java.time.LocalDateTime = 2018-06-26T17:31:36.858
scala> Range (0, 10).map( _ => (temp.plusSeconds(600)))
res1: scala.collection.immutable.IndexedSeq[java.time.LocalDateTime] = Vector(
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858)
如果你想要增量 .plusSeconds
使用可以使用累加器模式,
scala> def add(start: Int, end: Int, date: LocalDateTime, dates: List[LocalDateTime]): List[LocalDateTime] = {
| if ( start == end ) dates
| else {
| val newDate = date.plusSeconds(600)
| add(start + 1, end, newDate, dates :+ newDate)
| }
| }
add: (start: Int, end: Int, date: java.time.LocalDateTime, dates: List[java.time.LocalDateTime])List[java.time.LocalDateTime]
scala> add(0, 10, LocalDateTime.now(), List.empty)
res19: List[java.time.LocalDateTime] = List(
2018-06-26T18:10:23.055,
2018-06-26T18:20:23.055,
2018-06-26T18:30:23.055,
2018-06-26T18:40:23.055,
2018-06-26T18:50:23.055,
2018-06-26T19:00:23.055,
2018-06-26T19:10:23.055,
2018-06-26T19:20:23.055,
2018-06-26T19:30:23.055,
2018-06-26T19:40:23.055)
或者您可以使用 List.iterate
,它基本上也是使用可变累加器模式。
def iterate[A](start: A, len: Int)(f: A => A): CC[A] = {
val b = newBuilder[A]
if (len > 0) {
b.sizeHint(len)
var acc = start
var i = 1
b += acc
while (i < len) {
acc = f(acc)
i += 1
b += acc
}
}
b.result()
}
我尝试从 start_time 生成 Array/List 数据,所以我的代码是
var temp = parse_time
// for (i <- 1 to 10) yield temp.plusSeconds(600) // method 1
val max = 10
Range (0, max).map( _ => (temp.plusSeconds(600))) // method 2
这两种方法都将产生相同的结果,数组中的数据没有任何增量变化。
谁能帮我弄清楚为什么以及如何解决它?
如果您想从上一个条目生成下一个条目(从 temp
开始),请尝试 List.iterate
:
List.iterate(temp, max)(_.plusSeconds(600))
这是它对整数的作用:
List.iterate(42, 10)(_ + 600)
产生:
List(42, 642, 1242, 1842, 2442, 3042, 3642, 4242, 4842, 5442)
这是另一个 java.time.LocalDateTime
的例子:
List.iterate(LocalDateTime.now(), 10)(_.plusSeconds(600)) foreach println
输出:
2018-06-27T12:52:53.237
2018-06-27T13:02:53.237
2018-06-27T13:12:53.237
2018-06-27T13:22:53.237
2018-06-27T13:32:53.237
2018-06-27T13:42:53.237
2018-06-27T13:52:53.237
2018-06-27T14:02:53.237
2018-06-27T14:12:53.237
2018-06-27T14:22:53.237
List.tabulate(max)(i => temp.plusSeconds(600 * i))
因为 .plusSeconds
产生了一个新值而不是改变原始值,所以你得到的所有结果加上 600。
这里是示例 LocalDateTime
或 OffsetDateTime
scala> import java.time.LocalDateTime
import java.time.LocalDateTime
scala> val temp = LocalDateTime.now
temp: java.time.LocalDateTime = 2018-06-26T17:31:36.858
scala> Range (0, 10).map( _ => (temp.plusSeconds(600)))
res1: scala.collection.immutable.IndexedSeq[java.time.LocalDateTime] = Vector(
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858,
2018-06-26T17:41:36.858)
如果你想要增量 .plusSeconds
使用可以使用累加器模式,
scala> def add(start: Int, end: Int, date: LocalDateTime, dates: List[LocalDateTime]): List[LocalDateTime] = {
| if ( start == end ) dates
| else {
| val newDate = date.plusSeconds(600)
| add(start + 1, end, newDate, dates :+ newDate)
| }
| }
add: (start: Int, end: Int, date: java.time.LocalDateTime, dates: List[java.time.LocalDateTime])List[java.time.LocalDateTime]
scala> add(0, 10, LocalDateTime.now(), List.empty)
res19: List[java.time.LocalDateTime] = List(
2018-06-26T18:10:23.055,
2018-06-26T18:20:23.055,
2018-06-26T18:30:23.055,
2018-06-26T18:40:23.055,
2018-06-26T18:50:23.055,
2018-06-26T19:00:23.055,
2018-06-26T19:10:23.055,
2018-06-26T19:20:23.055,
2018-06-26T19:30:23.055,
2018-06-26T19:40:23.055)
或者您可以使用 List.iterate
,它基本上也是使用可变累加器模式。
def iterate[A](start: A, len: Int)(f: A => A): CC[A] = {
val b = newBuilder[A]
if (len > 0) {
b.sizeHint(len)
var acc = start
var i = 1
b += acc
while (i < len) {
acc = f(acc)
i += 1
b += acc
}
}
b.result()
}