将时间单位转换为时间戳
Convert timeunits to timestamps
我用 simmer 做了一个模拟,我得到了一个事件日志。 activity 的开始和结束以时间单位表示。
它们看起来如下:
| 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)
据我了解,这意味着模拟 运行s 持续 1 周(7 天)。
这是为了帮助您入门。我不是 DES/simmer 专家。但据我所知,activity 日志为您提供了特定活动的开始和结束时间(在您的模拟中)。
我不太清楚2700的“模拟单位”是怎么算一周的。但是你可以根据这个来计算你的“模拟时间步长”。
首先,我假设给定的 activity 开始和结束“单位”是分钟。
activity log
的可重现数据
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
)
将单位转换为持续时间
如上所述,这是您必须考虑将“模拟单位”转换为持续时间的地方。这将影响您必须乘以您的值以将它们转换为测量时间单位的因素。
帮助将 double 转换为持续时间的包是 {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
转换为秒数。
我假设您的 activity 次/模拟步骤时间以分钟为单位。
因此,我们需要乘以 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
显然,上述逻辑很简单,您可能需要为持续时间添加不同的时间。
例如,如果后续activity(步骤)的开始在上一步之后,则需要开始创建计算结束时间并将其用于下一步,如start_time,等等。不幸的是,您的问题并不清楚。
但是随着持续时间的转换,您应该拥有了前进的基石。
我用 simmer 做了一个模拟,我得到了一个事件日志。 activity 的开始和结束以时间单位表示。 它们看起来如下:
| 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)
据我了解,这意味着模拟 运行s 持续 1 周(7 天)。
这是为了帮助您入门。我不是 DES/simmer 专家。但据我所知,activity 日志为您提供了特定活动的开始和结束时间(在您的模拟中)。
我不太清楚2700的“模拟单位”是怎么算一周的。但是你可以根据这个来计算你的“模拟时间步长”。
首先,我假设给定的 activity 开始和结束“单位”是分钟。
activity log
的可重现数据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
)
将单位转换为持续时间
如上所述,这是您必须考虑将“模拟单位”转换为持续时间的地方。这将影响您必须乘以您的值以将它们转换为测量时间单位的因素。
帮助将 double 转换为持续时间的包是 {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
转换为秒数。
我假设您的 activity 次/模拟步骤时间以分钟为单位。
因此,我们需要乘以 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
显然,上述逻辑很简单,您可能需要为持续时间添加不同的时间。
例如,如果后续activity(步骤)的开始在上一步之后,则需要开始创建计算结束时间并将其用于下一步,如start_time,等等。不幸的是,您的问题并不清楚。
但是随着持续时间的转换,您应该拥有了前进的基石。