使用定义相同功能的包有哪些好的开发模式?在我的情况,lubridate
以及data.table
这两个定义wday
.
考虑这个例子:
library(ggplot2)
library(lubridate)
set.seed(4)
date <- seq(from = as.POSIXct("2012-01-01"), to = as.POSIXct("2014-12-31"), by = "days")
value <- c(rnorm(274, 50, 1), rnorm(274, 55, 1), rnorm(274, 55, 2), rnorm(274, 60, 2))
df <- data.frame(date, value)
head(df)
# date value
# 1 2012-01-01 50.21675
# 2 2012-01-02 49.45751
# 3 2012-01-03 50.89114
# 4 2012-01-04 50.59598
# 5 2012-01-05 51.63562
# 6 2012-01-06 50.68928
ggplot(df, aes(x=yday(date), y=value, color=factor(year(date)))) +
geom_line()
Run Code Online (Sandbox Code Playgroud)
这产生了这个情节:
有哪些方法可以使轴按月格式化为日期?我试图确定一种干净的方式来利用两者lubridate
,scale_x_date
如果可能的话?
也许有更好的方法来创建这种类型的图形?也就是说,按年创造因素并将它们叠加在一起?(注意:我不想使用facet_wrap
或facet_grid
用于此示例).
这令我很沮丧.即使lubridate
我在循环它们时也无法保持日期以保持其类型.例如:
require(lubridate)
yearrange = ymd(20110101) + years(seq(4))
yearrange
#[1] "2012-01-01 UTC" "2013-01-01 UTC" "2014-01-01 UTC" "2015-01-01 UTC"
class(yearrange)
#[1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)
但是,如果我试图循环多年(在我的数据集中为每年创建一个单独的图):我丢失了年份的格式,并且必须重新投射数据
for (yr in yearrange) { show(yr) }
#[1] 1325376000
#[1] 1356998400
#[1] 1388534400
#[1] 1420070400
Run Code Online (Sandbox Code Playgroud)
如果我循环指定索引,我会返回日期对象:
for (i in seq(length(yearrange))) { show(yearrange[i]) }
#[1] "2012-01-01 UTC"
#[1] "2013-01-01 UTC"
#[1] "2014-01-01 UTC"
#[1] "2015-01-01 UTC"
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以避免索引选项,而不使用foreach
,或者这是唯一的方法吗?
我有一个像这样的数据帧:
library(dplyr)
data <- data_frame(
timestamp_utc = c('2015-11-18 03:55:04', '2015-11-18 03:55:08',
'2015-11-18 03:55:10'),
local_tz = c('America/New_York', 'America/Los_Angeles',
'America/Indiana/Indianapolis')
)
Run Code Online (Sandbox Code Playgroud)
我需要创建一个新的变量,将UTC时间戳转换为local_tz
列中定义的本地时间.然而,两者format
和with_tz
(来自lubridate
)只期望一个时区,而不是时区矢量.我正在寻找这样的东西:
mutate(data, timestamp_local = with_tz(timestamp_utc, tzone = local_tz))
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
对于日期时间,fasttime为POSIXct提供了非常快速的解析
library('fasttime')
library('lubridate')
library('microbenchmark')
# parse character to POSIXct
Sys.setenv(TZ='UTC')
test <- rep('2011-04-02 11:01:00',1e4)
microbenchmark(
test1 <- fastPOSIXct(test),
test2 <- fast_strptime(test,format='%Y-%m-%d %H:%M:%S'),
test3 <- as.POSIXct(test, format='%Y-%m-%d %H:%M:%S'),
test4 <- ymd_hms(test),
times=100)
Unit: microseconds
expr min lq mean median uq max
test1 <- fastPOSIXct(test) 663.123 692.337 1409.448 701.821 712.4965 71231.585
test2 <- fast_strptime(test, format = "%Y-%m-%d %H:%M:%S") 1026.342 1257.508 1263.157 1264.928 1273.8145 1366.438
test3 <- as.POSIXct(test, format = "%Y-%m-%d %H:%M:%S") 9865.265 10060.450 10154.651 10145.551 10186.3030 13358.136
test4 …
Run Code Online (Sandbox Code Playgroud) 我有一个数据框,日期为"%d-%m-%Y"格式,并有周数.日期是工作日,我希望那个星期的星期六在另一列.
我最初使用Chron包中的函数检查日期是工作日还是周末,但这是布尔验证.我已将日期变量格式化为日期格式,并提取每个日期的周数.
df = data.frame(date=c("2014-08-20", "2014-08-25", "2014-10-08"))
df$date=as.Date(df$date,format="%Y-%m-%d")
df$week=week(ymd(df$date))
Run Code Online (Sandbox Code Playgroud)
预期结果应该是:
date week EOW
2014-08-20 34 2014-08-23
2014-08-25 34 2014-08-30
2014-10-08 41 2014-10-11
Run Code Online (Sandbox Code Playgroud) 我有一个包含2列的数据框:日期和返回值。
df <- tibble(
date = lubridate::today() +0:9,
return= c(1,2.5,2,3,5,6.5,1,9,3,2))
Run Code Online (Sandbox Code Playgroud)
现在,我想添加第三列,条件为ifelse。如果第t天的收益大于3.5,则第二天t + 1的重运行为NA(否则=第t天的收益)。
这是我想要的输出:
date return retrun_subsequent_day
<date> <dbl> <dbl>
1 2019-03-14 1 1
2 2019-03-15 2.5 2.5
3 2019-03-16 2 2
4 2019-03-17 3 3
5 2019-03-18 5 5
6 2019-03-19 6.5 NA
7 2019-03-20 1 NA
8 2019-03-21 9 9
9 2019-03-22 3 NA
10 2019-03-23 2 2
Run Code Online (Sandbox Code Playgroud)
有人可以描述我如何制定这种条件吗?
我正在使用POSIXct格式的一些时间戳。目前,它们都显示在“ UTC”时区中,但实际上有些已知处于“ America / New_York”时区中。我想更正时间戳,以便它们都读为正确的时间。
我最初使用和ifelse()
一起声明lubridate::with_tz()
。这没有按预期方式工作,因为ifelse()
未在POSIXct中返回值。
然后,我dplyr::if_else()
根据此处的其他帖子进行了尝试,但效果也不理想。
我可以使用更改单个时间戳,甚至可以将时间戳列表更改为不同的时区with_tz()
(因此我知道它可以工作),但是当我在if_else()
输出中使用它时,所有的值都将在给定“ yes”参数的情况下返回in if_else()
。
library(lubridate)
library(dplyr)
x <- data.frame("ts" = as.POSIXct(c("2017-04-27 13:44:00 UTC",
"2017-03-10 12:22:00 UTC", "2017-03-22 10:24:00 UTC"), tz = "UTC"),
"tz" = c("UTC","EST","UTC"))
x <- mutate(x, ts_New = if_else(tz == "UTC", with_tz(ts, "America/New_York"), ts))
Run Code Online (Sandbox Code Playgroud)
预期结果低于ts_New的时间戳调整为新时区的情况,但仅当tz =“ UTC”中的值时才如此。tz =“ America / New_York”的时间戳不应更改。
ts tz ts_NEW
1 2017-04-27 13:44:00 UTC 2017-04-27 09:44:00
2 2017-03-10 12:22:00 EST 2017-03-10 12:22:00
3 2017-01-22 …
Run Code Online (Sandbox Code Playgroud) 我有一个日期向量,想要检查某个特定日期,在向量中的150天内以及该日期之前的150天内,向量中是否存在值。我的数据的一个简单示例如下所示:
given_date <- as.Date('2006-06-06')
dates <- as.Date(c("2005-02-22", "2005-04-26", "2005-08-02", "2005-10-04", "2005-12-06", "2006-03-14", "2006-06-06"))
Run Code Online (Sandbox Code Playgroud)
我知道我可以做的某个日期会given_date %in% dates
返回TRUE
。
但是,对于我的问题,我想检查类似于以下内容的内容:
ifelse(range(given_date-1, given_date-150) %in% dates & range(given_date-151, given_date-300) %in% dates, TRUE, FALSE)
因此对于我提供的数据,将返回结果,TRUE
因为在150天内存在一个日期given_date
(例如2006-03-14存在于(2006-01-07,2006-06-06)范围内),并且在此日期之前的150天内存在另一个(例如,2005-10-04存在于(2005-08-10,2006-01-07)的范围内)。
感谢您对我如何在R中做到这一点的任何帮助!
我有一个以日期时间格式转换开始和结束的数据框,如下所示:
shift_time <- data.frame(
started_at = c("2019-09-01 02:00:00 AEST", "2019-09-02 05:00:00 AEST", "2019-11-04 20:00:00 AEDT"),
ended_at = c("2019-09-01 11:30:00 AEST", "2019-09-02 19:00:00 AEST", "2019-11-05 04:00:00 AEDT")
)
Run Code Online (Sandbox Code Playgroud)
我还有另一个带有公众假期日期的数据框,如下所示:
public_holidays <- data.frame(
hol_name = c('Cup Day', 'Christmas'),
date = c("2019-11-05", "2019-12-25")
)
Run Code Online (Sandbox Code Playgroud)
我想用新的列更新shift_time df,以记录在公共假日发生的轮班小时数-即,我要计算轮班间隔与适用的任何公共假日之间的重叠(以小时为单位)。在上面的示例中,新变量的期望值为0、0、4。
有没有办法做到这一点而无需创建很多新变量(例如,difftimes,interval,匹配日期)?