我面临着计算出生日期和任意日期的年龄(年,月或周)的共同任务.事情是,我经常需要在许多记录(> 3亿)上执行此操作,因此性能是一个关键问题.
在SO和Google中快速搜索后,我找到了3个替代方案:
所以,这是我的玩具代码:
# Some toy birthdates
birthdate <- as.Date(c("1978-12-30", "1978-12-31", "1979-01-01",
"1962-12-30", "1962-12-31", "1963-01-01",
"2000-06-16", "2000-06-17", "2000-06-18",
"2007-03-18", "2007-03-19", "2007-03-20",
"1968-02-29", "1968-02-29", "1968-02-29"))
# Given dates to calculate the age
givendate <- as.Date(c("2015-12-31", "2015-12-31", "2015-12-31",
"2015-12-31", "2015-12-31", "2015-12-31",
"2050-06-17", "2050-06-17", "2050-06-17",
"2008-03-19", "2008-03-19", "2008-03-19",
"2015-02-28", "2015-03-01", "2015-03-02"))
# Using a common arithmetic procedure ("Time differences in …Run Code Online (Sandbox Code Playgroud) 在R中,假设我有一些Lubridate日期的向量:
> Date
"2012-01-01 UTC"
"2013-01-01 UTC"
Run Code Online (Sandbox Code Playgroud)
接下来,假设我想看看这几天的周数:
> week(Date)
1
1
Run Code Online (Sandbox Code Playgroud)
Lubridate太棒了!
但是等等......我正在处理一个包含10,000行数据的时间序列......数据跨越3年.
我一直在努力寻找实现这一目标的方法:
> result of awesome R code here
1
54
Run Code Online (Sandbox Code Playgroud)
问题是:是否有一种简洁的方法可以在Lubridate的多年内输出一周的周数列表?更直接的是,我希望第二年的第一周能够代表第54周.而第三年的第一周将作为第107周的代表,令人作呕.
到目前为止,我已经尝试了一些hackney方案,但似乎无法创造一些没有用透明胶带固定在一起的东西.任何建议将不胜感激.提前致谢.
我有一个大的时间段数据集,由"开始"和"结束"列定义.有些时期重叠.
我想将所有重叠时间段组合(展平/合并/折叠)以具有一个"开始"值和一个"结束"值.
一些示例数据:
ID start end
1 A 2013-01-01 2013-01-05
2 A 2013-01-01 2013-01-05
3 A 2013-01-02 2013-01-03
4 A 2013-01-04 2013-01-06
5 A 2013-01-07 2013-01-09
6 A 2013-01-08 2013-01-11
7 A 2013-01-12 2013-01-15
Run Code Online (Sandbox Code Playgroud)
期望的结果:
ID start end
1 A 2013-01-01 2013-01-06
2 A 2013-01-07 2013-01-11
3 A 2013-01-12 2013-01-15
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
require(dplyr)
data <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L), class = "factor", .Label = "A"),
start = structure(c(1356998400, 1356998400, 1357084800, 1357257600,
1357516800, 1357603200, 1357948800), tzone = …Run Code Online (Sandbox Code Playgroud) 我有一个带有开始和结束时间的数据框:
id start_time end_time
1 1 2018-09-02 11:13:00 2018-09-02 11:54:00
2 2 2018-09-02 14:34:00 2018-09-02 14:37:00
3 3 2018-09-02 03:00:00 2018-09-02 03:30:00
4 4 2018-09-02 03:49:00 2018-09-02 03:53:00
5 5 2018-09-02 07:05:00 2018-09-02 08:05:00
6 6 2018-09-02 06:44:00 2018-09-02 06:57:00
7 7 2018-09-02 06:04:00 2018-09-02 08:34:00
8 8 2018-09-02 07:51:00 2018-09-02 08:15:00
9 9 2018-09-02 08:16:00 2018-09-02 08:55:00
Run Code Online (Sandbox Code Playgroud)
从这些时间段,我如何计算每天每小时发生的总分钟数?例如,如果一个时段从 9:45 开始并在 10:15 结束,我想将 15 分钟分配给 9:00 小时,将 15 分钟分配给 10:00 小时。
或者检查06上面数据中的小时,该小时包含在两个不同的行(句点)中:
6 6 2018-09-02 06:44:00 2018-09-02 06:57:00 …Run Code Online (Sandbox Code Playgroud) 当查看与从 PDT 到 PST 的时区更改重叠的日期时间值时,R 似乎在 1:36:14 而不是预期的 2:00:00 切换时区。具体来说,R 将 PST 时区分配给 2021-11-07 01:36:14 之后的所有日期时间(如下所示):
x <-c(
"2021-11-07 1:00:00",
"2021-11-07 1:00:01",
"2021-11-07 1:35:00",
"2021-11-07 1:36:00",
"2021-11-07 1:36:10",
"2021-11-07 1:36:14",
"2021-11-07 1:36:15",
"2021-11-07 1:36:30",
"2021-11-07 1:36:59",
"2021-11-07 1:45:00",
"2021-11-07 1:59:59",
"2021-11-07 2:00:00",
"2021-11-07 2:30:00"
)
x_pst <- as.POSIXct(x, tz = "PST8PDT")
> x_pst
# ...
[5] "2021-11-07 01:36:10 PDT" "2021-11-07 01:36:14 PDT"
[7] "2021-11-07 01:36:15 PST" "2021-11-07 01:36:30 PST"
# ...
Run Code Online (Sandbox Code Playgroud)
除此之外,lubridate 似乎在切换之前将所有日期时间调整为 PST(使用相同的数据):
x_pst <- lubridate::as_datetime(x, tz = "PST8PDT") …Run Code Online (Sandbox Code Playgroud) 请考虑以下时间戳
timestamp <- ymd_hms("2011-08-10 14:00:00", tz = "Pacific/Auckland")
> timestamp
[1] "2011-08-10 14:00:00 NZST"
Run Code Online (Sandbox Code Playgroud)
什么是最简单的方法来获取它的一天2011-08-10,并确保这一天是一个正确的日期,而不是一个字符串?
使用lubridate::day(timestamp)明显失败了.
我在lubridate包中偶然发现了一个奇怪的行为:dmy(NA)拖出一个错误,而不仅仅是返回一个NA.当我想转换一个包含一些元素为NA的列和一些通常转换没有问题的日期字符串时,这会导致我出现问题.
这是最小的例子:
library(lubridate)
df <- data.frame(ID=letters[1:5],
Datum=c("01.01.1990", NA, "11.01.1990", NA, "01.02.1990"))
df_copy <- df
#Question 1: Why does dmy(NA) not return NA, but throws an error?
df$Datum <- dmy(df$Datum)
Error in function (..., sep = " ", collapse = NULL) : invalid separator
df <- df_copy
#Question 2: What's a work around?
#1. Idea: Only convert those elements that are not NAs
#RHS works, but assigning that to the LHS doesn't work (Most likely problem::
#column …Run Code Online (Sandbox Code Playgroud) 我有一些时间序列数据要绘制,我想要更细粒度的轴刻度.例如:
library(lubridate)
library(ggplot2)
library(scales)
dat <- data.frame(date = paste0("09-01-", gsub(" ", "0", format(1:30))),
stringsAsFactors = FALSE)
dat$date <- ymd(dat$date)
dat$y <- rnorm(nrow(dat))
p <- ggplot(dat, aes(x = date, y = y)) + geom_point()
Run Code Online (Sandbox Code Playgroud)
根据这篇文章,我试过了
p + scale_x_continuous(breaks=pretty_breaks(n=10))
Run Code Online (Sandbox Code Playgroud)
但是Error: Discrete value supplied to continuous scale.关于如何做到这一点的任何想法?
R Under development (unstable) (2014-12-29 r67265)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
Running under: OS X 10.9.5 (Mavericks)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages: …Run Code Online (Sandbox Code Playgroud) 我想用它lubridate来计算出生日期和今天的日期.现在我有这个:
library(lubridate)
today<-mdy(08312015)
dob<-mdy(09071982)
today-dob
Run Code Online (Sandbox Code Playgroud)
这给了我他们几天的年龄.
请考虑以下示例
library(tidyverse)
library(lubridate)
time <- seq(from =ymd("2014-02-24"),to= ymd("2014-03-20"), by="days")
set.seed(123)
values <- sample(seq(from = 20, to = 50, by = 5), size = length(time), replace = TRUE)
df2 <- data_frame(time, values)
df2 <- df2 %>% mutate(day_of_week = wday(time, label = TRUE))
Source: local data frame [25 x 3]
time values day_of_week
<date> <dbl> <fctr>
1 2014-02-24 30 Mon
2 2014-02-25 45 Tues
3 2014-02-26 30 Wed
4 2014-02-27 50 Thurs
5 2014-02-28 50 Fri
6 2014-03-01 20 Sat
7 2014-03-02 …Run Code Online (Sandbox Code Playgroud)