标签: lubridate

关于持续时间与周期如何在每月添加的润滑剂中起作用的混淆

以下是我认为可能的错误:

require(lubridate)
d = as.Date("1994-03-31")
> d + months(1)
  [1] "1994-05-01"
Run Code Online (Sandbox Code Playgroud)

我的理解是,这应该返回到1994年4月底.请告知这是否确实是一个错误.

r date lubridate

4
推荐指数
1
解决办法
695
查看次数

将日期转换为R中的年月代表

我有一个Date,并有兴趣将其表示为一个整数yyyymm形式.目前,我这样做:

get_year_month <- function(d) { return(as.integer(format(d, "%Y%m")))}
mydate = seq.Date(from=as.Date("2012-01-01"), to=as.Date("5012-01-01"), by=1) 
system.time(ym <- get_year_month(mydate))
#    user  system elapsed 
#    5.972   0.974   6.951 
Run Code Online (Sandbox Code Playgroud)

这对于大型数据集来说非常慢.有更快的方法吗?请提供答案的时间安排,以便轻松比较.使用上面的例子.

r date posixct lubridate

4
推荐指数
1
解决办法
6922
查看次数

将字符月份名称转换为日期时间对象

我一定错过了一些简单的东西。

我有一个各种日期格式的 data.frame,并且我正在使用 lubridate,它可以很好地处理除月份名称本身之外的所有内容。我无法将月份名称转换为日期时间对象。

> head(dates)
    From         To
1       June     August
2    January   December
3 05/01/2013 10/30/2013
4       July   November
5 06/17/2013 10/14/2013
6 05/04/2013 11/23/2013
Run Code Online (Sandbox Code Playgroud)

尝试将 June 更改为日期时间对象:

> as_date(dates[1,1])
Error in charToDate(x) : 
  character string is not in a standard unambiguous format

> as_date("June")
Error in charToDate(x) : 
  character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)
  • 实际的年份和日期并不重要。我只需要一个月。zx8754 建议使用虚拟日期和年份。

r date lubridate

4
推荐指数
1
解决办法
2万
查看次数

使用具有lubridate函数的mutate计算年龄

我想根据出生日期计算年龄.

如果我使用lubridate,我会按照R给定出生日期和任意日期的有效和准确的年龄计算(年,月或周)运行以下内容

as.period(new_interval(start = birthdate, end = givendate))$year

但是,当我尝试使用mutatein dplyr来创建新变量时,我遇到了一个错误.

library(dplyr); library(lubridate)

birthdate <- ymd(c(NA, "1978-12-31", "1979-01-01", "1962-12-30"))
givendate <- ymd(c(NA, "2015-12-31", "2015-12-31", NA))

df <- data.frame(
    birthdate = birthdate,
    givendate = givendate)
Run Code Online (Sandbox Code Playgroud)

以下工作虽然它给出了所有日期和时间值.即年,月,日,小时,分钟和秒.

df<-df %>% mutate(age=as.period(interval(start = birthdate, end = givendate)))

# df
#    birthdate  givendate                  age
# 1       <NA>       <NA>                 <NA>
# 2 1978-12-31 2015-12-31   37y 0m 0d 0H 0M 0S
# 3 1979-01-01 2015-12-31 36y 11m 30d 0H 0M 0S
# 4 …
Run Code Online (Sandbox Code Playgroud)

r lubridate dplyr

4
推荐指数
2
解决办法
2008
查看次数

使用 lubridate 和 mutate 将日期格式从 %y-%m-%d %h:%m:%s 更改为 %Y%M%D

tbl_df有两列StartTimeStopTime。两者都是dttm

我想将其格式从 更改"%y-%m-%d %h:%m:%s""%y%m%d".

我试过了

data <- mutate(data, StartTime = ymd(StartTime), StopTime = ymd(StopTime))
Run Code Online (Sandbox Code Playgroud)

但它返回

警告消息: 1:解析所有格式失败。没有找到格式。2:所有格式都无法解析。没有找到格式。

我该怎么做?

请不要发送其他不使用 lubridate 包的问题。

谢谢

r lubridate mutate

4
推荐指数
1
解决办法
3801
查看次数

在时间范围之前和之后立即匹配记录

我的目标是根据时间加入两个数据表,dplyr或者data.table特别是在事件发生之前和之后立即获取记录.

在示例数据中,这种情况下的事件是踏板车行程.以下是四次旅行 - 两次由踏板车1拍摄,两次由踏板车2拍摄.

> testScooter
                 start                 end id
1: 2018-01-18 22:19:13 2018-01-18 22:26:31  1
2: 2018-01-18 23:29:22 2018-01-18 23:37:53  1
3: 2018-01-18 00:22:02 2018-01-18 00:29:21  2
4: 2018-01-18 00:37:52 2018-01-18 01:06:53  2
Run Code Online (Sandbox Code Playgroud)

在单独的表中是以几乎相等的间隔隔开的记录.本id的比赛中与车标no时,跳闸正在进行中.

> intervals
   id                time available charge
1   1 2018-01-18 21:31:07       yes     83
2   1 2018-01-18 21:41:07       yes     83
3   1 2018-01-18 21:51:07       yes     83
4   1 2018-01-18 22:01:07       yes     83
5   1 2018-01-18 22:11:07       yes     83
6   1 …
Run Code Online (Sandbox Code Playgroud)

r lubridate dplyr data.table

4
推荐指数
1
解决办法
102
查看次数

分组并总结条件日期范围方面 - dplyr?

披露 - 这是我的第一个 SO 问题,如果这是一个重复的问题,我深表歉意,但我已经找了一段时间,但没有找到这个特定场景的答案

R 版本:3.4.2

我想要一种按特定标识符对数据进行分组的有效方法,然后根据条件进行汇总 - 对每一行动态进行。具体来说,如果另一个实例在当前行的 1 年内,则按 ID 分组,然后总结另一个变量发生的实例(紧急访问)的数量。

以下是数据开始时的示例:

更新以包含 2 个紧急案例的示例

library(lubridate)
   > dat <- data.frame("ID" = c(6,6,6,7,7,10,11,11,11),
                      "Admit_Dt" = as.Date(c('2013-08-12', '2013-12-12', '2016-01-03','2011-04-01', '2011-09-20','2012-02-19','2014-06-24','2014-08-12','2014-09-01')), 
                      "Urgent" = c(0,1,1,1,0,0,1,1,1)) 
   > dat

| ID | Admit_Dt   | Urgent|
|  6 | 2013-08-12 |      1| 
|  6 | 2013-12-12 |      0|
|  6 | 2016-01-03 |      1|
|  7 | 2011-04-01 |      1|
|  7 | 2011-09-20 |      0|
| 10 | 2012-02-19 |      0|
| 11 …
Run Code Online (Sandbox Code Playgroud)

r data-manipulation lubridate dplyr

4
推荐指数
1
解决办法
468
查看次数

使用 Lubridate 将 R 中的字符列转换为日期

我有一个名为 date 的字符列,其中包含诸如“2015 年 1 月 15 日”之类的数据,我正在尝试使用 as.date 函数将其转换为 ymd 格式,并且我还尝试了 lubridate 包。我尝试过以下方法:

shootings$Date <- ymd(shootings$Date))
Run Code Online (Sandbox Code Playgroud)

shootings$Date <- as.Date(as.character(shootings$Date))
Run Code Online (Sandbox Code Playgroud)

如果可能,我希望它看起来像 2013-01-01 (ymd)。但我一直遇到解析问题,或者数据只是 N/A。任何帮助,将不胜感激

r date lubridate

4
推荐指数
2
解决办法
8435
查看次数

如何更简洁地从“开始 - 结束”字符串计算持续时间

我有时间戳指示事件开始的时间和结束的时间:

x <- "00:01:00.000 - 00:01:10.500"
Run Code Online (Sandbox Code Playgroud)

我需要计算事件的持续时间。利用hms从包lubridate以及lapplystrsplit它给我预期的输出:

library(lubridate)
unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[2] - unlist(lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x))))[1] 
[1] 10.5
Run Code Online (Sandbox Code Playgroud)

但我觉得代码完全不优雅,一点也不简洁。有没有更好的方法来获得持续时间?

编辑

如果,因为事实确实如此,有很多超过在短短的一个值x,如:

x <- c("00:01:00.000 - 00:01:10.500", "00:12:12.000 - 00:13:10.500")
Run Code Online (Sandbox Code Playgroud)

我想出了这个解决方案:

timepoints <- lapply(strsplit(x, split=" - "), function(x) as.numeric(hms(x)))
duration <- lapply(timepoints, function(x) x[2]-x[1])

duration
[[1]]
[1] 10.5

[[2]]
[1] 58.5
Run Code Online (Sandbox Code Playgroud)

但是,再一次,肯定有一个更好、更短的。

duration r lubridate

4
推荐指数
1
解决办法
87
查看次数

将重叠间隔与 lubridate 结合

我希望合并润滑间隔,以便如果它们重叠,则从内部第一个时间获取最小值和从内部最后一个时间获取最大值并总结以创建一个跨越整个时间段的新间隔。这是一个reprex:

library(lubridate, warn.conflicts = FALSE)
library(dplyr, warn.conflicts = FALSE)
library(tibble)

dat <- tibble(
  animal = rep(c("elk", "wolf", "moose"), each = 2),
  date_interval = c(
    interval(as.Date("2020-04-01"), as.Date("2020-04-05")),
    interval(as.Date("2020-04-10"), as.Date("2020-04-15")),
    interval(as.Date("2020-03-01"), as.Date("2020-04-01")),
    interval(as.Date("2020-02-15"), as.Date("2020-03-15")),
    interval(as.Date("2020-10-01"), as.Date("2020-11-01")),
    interval(as.Date("2020-09-15"), as.Date("2020-10-15"))
  )
)

dat
#> # A tibble: 6 x 2
#>   animal date_interval                 
#>   <chr>  <Interval>                    
#> 1 elk    2020-04-01 UTC--2020-04-05 UTC
#> 2 elk    2020-04-10 UTC--2020-04-15 UTC
#> 3 wolf   2020-03-01 UTC--2020-04-01 UTC
#> 4 wolf   2020-02-15 UTC--2020-03-15 UTC
#> 5 moose  2020-10-01 …
Run Code Online (Sandbox Code Playgroud)

r lubridate dplyr

4
推荐指数
1
解决办法
100
查看次数

标签 统计

lubridate ×10

r ×10

date ×4

dplyr ×4

data-manipulation ×1

data.table ×1

duration ×1

mutate ×1

posixct ×1