【问题标题】:Convert timeunits to timestamps将时间单位转换为时间戳
【发布时间】:2021-10-02 15:15:58
【问题描述】:

我用 simmer 做了一个模拟,得到了一个事件日志。活动的开始和结束以时间单位表示。 它们如下所示:

|   start   |    end    |
| --------- | --------  |
|  5.658733 | 13.244381 |
| 11.342792 | 13.583395 |
| 12.000000 | 13.612889 |
| 14.000000 | 14.000000 |
...
| 2694.162  | 6699.370  |

我想将这些转换为时间戳。为此,我想确定模拟开始的确切时间和日期,并将以下所有时间单位相应地转换为类似于“2020-01-02 11:23:00”的时间戳。 我将模拟设置为运行到时间单位 2700

run(until=2700)

据我了解,这意味着模拟运行 1 周(7 天)。

【问题讨论】:

  • 您好 ncnc_2020,我不是 DES/simmer 专家,但据我所知,“处理时间”(或模拟中的步骤)是由上下文给出的。因此,2700 个“步骤”取决于您的模拟设置或您建模的问题。如果我花一周时间,那么 2700 步将相当于 (7 * 24 * 60 * 60) / 2700 = 224 秒。对于“单位步长”来说,这感觉有点奇怪。在下面适应您的问题。希望对您有所帮助。

标签: r timestamp simulation


【解决方案1】:

这是为了帮助您入门。我不是 DES/simmer 专家。但我的理解是,活动日志为您提供了特定活动的开始和结束时间(在您的模拟中)。

我不完全确定 2700 的“模拟单位”如何计算一周。但是您可以根据此计算您的“模拟时间步长”。

首先,我假设给定的活动开始和结束“单位”是分钟。

活动日志的可重现数据

library(dplyr)  # tidyverse data frame handling

log <- tibble::tribble(
  ~start,       ~end
  ,5.658733, 13.244381
  ,11.342792, 13.583395
  ,12.000000, 13.612889
  ,14.000000, 14.000000
  ,2694.162 ,6699.370
  )

以持续时间转换单位

如上所述,这是您必须考虑将“模拟单位”转换为持续时间的地方。这将影响您必须乘以您的值以将它们转换为时间测量单位的因素。

{hms} 是一个帮助将双精度转换为持续时间的软件包。

library(hms)

## check out what hms does
as_hms(log$start)
00:00:05.658733
00:00:11.342792
00:00:12.000000
00:00:14.000000
00:44:54.162000

{hms} 将您的 double-simulation-step-units 转换为秒。

我假设您的活动时间/模拟步骤时间以分钟为单位。
因此,我们需要乘以 60。

请注意,您需要在此处选择相应的转换。例如,您的 2700 个模拟时间单位可以是 1 周 = 7 天 = 7 * 24 小时 = 7 * 24 * 60 * 60 秒。那么你的转换将是 (7 * 24 * 60 * 60) / 2700。但我把这个留给你来验证和调整。

log <- log %>% mutate(
  start_moment = as_hms(start * 60)
, end_moment   = as_hms(end * 60)
)

log
# A tibble: 5 x 4
    start    end start_moment   end_moment     
    <dbl>  <dbl> <time>         <time>         
1    5.66   13.2 00:05:39.52398  00:13:14.66286
2   11.3    13.6 00:11:20.56752  00:13:35.00370
3   12      13.6 00:12:00.00000  00:13:36.77334
4   14      14   00:14:00.00000  00:14:00.00000
5 2694.   6699.  44:54:09.72000 111:39:22.20000

将持续时间添加到开始时间

其余的按照您的建议,将转换后的持续时间添加到您的模拟开始时间。例如:

library(lubridate) # for date-time operations

sim_start <- lubridate::ymd_hms("2020-01-02 11:23:00")  # define your sim start

log <- log %>% 
  mutate(
     start_time = sim_start + start_moment
   , end_time   = sim_start + end_moment
)

这会产生

log
# A tibble: 5 x 6
    start    end start_moment   end_moment      start_time          end_time           
    <dbl>  <dbl> <time>         <time>          <dttm>              <dttm>             
1    5.66   13.2 00:05:39.52398  00:13:14.66286 2020-01-02 11:28:39 2020-01-02 11:36:14
2   11.3    13.6 00:11:20.56752  00:13:35.00370 2020-01-02 11:34:20 2020-01-02 11:36:35
3   12      13.6 00:12:00.00000  00:13:36.77334 2020-01-02 11:35:00 2020-01-02 11:36:36
4   14      14   00:14:00.00000  00:14:00.00000 2020-01-02 11:37:00 2020-01-02 11:37:00
5 2694.   6699.  44:54:09.72000 111:39:22.20000 2020-01-04 08:17:09 2020-01-07 03:02:22

显然,上述逻辑很简单,您可能需要在持续时间中添加不同的时间。

例如,如果后续活动(步骤)的开始在上一步之后,您需要开始创建计算结束时间并将其用于下一步作为 start_time 等。不幸的是,您的问题并不清楚.

但是,随着持续时间的转换,您应该拥有让您继续前进的基石。

【讨论】:

  • 谢谢!这有很大帮助!你知道有什么功能可以帮助我做相反的事情吗?将时间戳转换为我自己定义 0 的双精度数?
  • 很高兴听到我的回答帮助您继续前进。要使时间戳加倍,请使用 library(lubridate) 尝试以下操作;图书馆(hms); period_to_seconds(hms("12:12:54")).
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2018-11-29
  • 2017-05-28
  • 1970-01-01
  • 2013-04-07
  • 2011-01-15
相关资源
最近更新 更多