标签: lubridate

函数命名冲突

使用定义相同功能的包有哪些好的开发模式?在我的情况,lubridate以及data.table这两个定义wday.

naming conflict r lubridate data.table

6
推荐指数
1
解决办法
351
查看次数

有效地使用lubridate和ggplot2作为日期轴

考虑这个例子:

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_wrapfacet_grid用于此示例).

r ggplot2 lubridate

6
推荐指数
1
解决办法
5255
查看次数

以R丢失格式循环播放日期

这令我很沮丧.即使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,或者这是唯一的方法吗?

loops r date lubridate

6
推荐指数
1
解决办法
1880
查看次数

with_tz与时区矢量

我有一个像这样的数据帧:

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列中定义的本地时间.然而,两者formatwith_tz(来自lubridate)只期望一个时区,而不是时区矢量.我正在寻找这样的东西:

mutate(data, timestamp_local = with_tz(timestamp_utc, tzone = local_tz))
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

r lubridate dplyr

6
推荐指数
2
解决办法
1314
查看次数

是否有一个快速解析日期

对于日期时间,fasttimePOSIXct提供了非常快速的解析

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)

r date posixct lubridate

6
推荐指数
1
解决办法
1529
查看次数

如何将日期转换为最近的周末(周六)

我有一个数据框,日期为"%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)

r date weekend lubridate chron

6
推荐指数
1
解决办法
114
查看次数

ifelse()函数-参考第二天

我有一个包含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)

有人可以描述我如何制定这种条件吗?

r lubridate tibble

6
推荐指数
2
解决办法
74
查看次数

在R中使用dplyr :: if_else()基于另一个变量的值更改POSIXct时间戳的时区

我正在使用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)

timestamp r posixct lubridate dplyr

6
推荐指数
1
解决办法
88
查看次数

检查日期向量中是否存在位于给定范围内的值

我有一个日期向量,想要检查某个特定日期,在向量中的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中做到这一点的任何帮助!

if-statement r vector lubridate

6
推荐指数
1
解决办法
66
查看次数

润滑-查找间隔和日期之间的重叠时间

我有一个以日期时间格式转换开始和结束的数据框,如下所示:

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,匹配日期)?

r lubridate

6
推荐指数
1
解决办法
141
查看次数