标签: lubridate

使用 lubridate 从周数中查找月份

我有这个日期列表:

library(lubridate)
my.dates = ymd(c("2013-12-14", "2014-01-18", "2014-01-27", "2013-12-13", "2013-12-29", "2013-12-06"))
Run Code Online (Sandbox Code Playgroud)

lubridate::week当我将这些日期转换为周数时,以下函数会输出一个数字向量:

week(my.dates)
[1] 50  3  4 50 52 49
Run Code Online (Sandbox Code Playgroud)

我可以lubridate输出转换my.dates为周数和年份数的日期 ("POSIXct" "POSIXt") 对象吗?所以输出应该是一个日期对象(不是字符或数字向量),格式如下:

[1] "50-2013" "3-2014"   "4-2014"   "50-2013" "52-2013" "49-2013"
Run Code Online (Sandbox Code Playgroud)

我对使用lubridate.

r date lubridate

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

当x轴为mm-dd时,使用ggplot2编辑轴刻度标签

我有一个数据集,其中x轴是一个日期,但它只是mm-dd(没有年份).我使用year作为组变量,因为我试图在同一个情节上显示同样的变化.x轴标签太拥挤,我想限制刻度线标签,以便不显示每个日期.这可能是隔天,每隔三天,每周一天 - 其中任何一个都可行.

我已经尝试了一些解决方案,但无法让它们工作,我假设因为我的x轴不是Date,而是一个角色.(在获得x轴的这个mm-dd解决方案之前,我尝试使用yyyy-mm-dd日期格式绘制x轴,但是没有成功找出如何让ggplot2忽略"yyyy"部分.)

一个例子:

myDF <- data.frame(
        myDate = format(seq(as.Date("2014-02-01"), 
                 length=28, by="1 day"), "%m-%d"),
        myVar = sample(100,28),
        myGroup = sample(2,28,TRUE)
                   )
head(myDF)

  myDate myVar myGroup
  02-01    87       1
  02-02    34       1
  02-03    48       2
  02-04    59       1
  02-05    98       1
  02-06    18       2

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) + 
geom_line() 
Run Code Online (Sandbox Code Playgroud)

这里的一切都是正确的,除了刻度标签过于挤压.

我试过了:

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) +   
geom_line() + scale_x_discrete(breaks = c(1,10,20))
Run Code Online (Sandbox Code Playgroud)

这似乎会混淆ggplot,因为标签完全消失了.(与seq()尝试的结果相同.)

我也尝试过:

ggplot(myDF, aes(myDate, myVar, group=myGroup, color=as.factor(myGroup))) + 
geom_line() + scale_x_date(breaks = "1 week")
Run Code Online (Sandbox Code Playgroud)

这会引发错误:myDate不是Date.

我已经将刻度标签的格式切换为垂直格式,但它仍然过于拥挤.

任何提示将非常感谢.谢谢!

plot r character ggplot2 lubridate

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

R:lubridate 的 dst() 未按预期工作

我怀疑我在做一些非常愚蠢的事情,但我无法让该dst功能按lubridate预期工作。

library(lubridate)

x <- c("2016-01-01", "2016-06-01")

dst(x) # Returns c(FALSE, TRUE)
dst(as.Date(x)) # Returns c(FALSE, FALSE)
Run Code Online (Sandbox Code Playgroud)

我在这两种情况下期望的结果都是c(FALSE, TRUE)dst但是,只有当我传递字符向量而不是对象时,我才会得到预期的结果Date。我使用的是 OS X,我当前的时区是 PST ( America/Los_Angeles)。

timezone r dst lubridate

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

基于一天中不同时间的密度图

我有以下数据集:

https://app.box.com/s/au58xaw60r1hyeek5cua6q20byumgvmj

我想根据一天中的时间创建密度图。这是我到目前为止所做的:

library("ggplot2")
library("scales")
library("lubridate")

timestamp_df$timestamp_time <- format(ymd_hms(hn_tweets$timestamp), "%H:%M:%S")

ggplot(timestamp_df, aes(timestamp_time)) + 
       geom_density(aes(fill = ..count..)) +
       scale_x_datetime(breaks = date_breaks("2 hours"),labels=date_format("%H:%M"))
Run Code Online (Sandbox Code Playgroud)

它给出以下错误: Error: Invalid input: time_trans works with objects of class POSIXct only

如果我将其转换为POSIXct,它会将日期添加到数据中。

更新1

以下数据转换为“NA”

timestamp_df$timestamp_time <- as.POSIXct(timestamp_df$timestamp_time, format = "%H:%M%:%S", tz = "UTC"
Run Code Online (Sandbox Code Playgroud)

更新2

以下是我想要实现的目标: 在此输入图像描述

r ggplot2 lubridate density-plot

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

R / lubridate:计算两个时期之间重叠的天数

我正在尝试计算两个时间段之间重叠的天数。一个周期固定在开始和结束日期,另一个在数据框中记录为开始和结束日期。

编辑:我正在处理具有发布日期 (df$start) 和取消发布日期 (df$end) 的广告。我试图找出他们在特定月份(my.start = 2018-01-01,my.end = 2018-08-31)在线的天数。

library(dplyr)
library(lubridate)

my.start <- ymd("2018-08-01")
my.end <- ymd("2018-08-31")

df <- data.frame(start = c("2018-07-15", "2018-07-20", "2018-08-15", "2018-08-20", "2018-09-01"), 
                 end   = c("2018-07-20", "2018-08-05", "2018-08-19", "2018-09-15", "2018-09-15"))

# strings to dates
df <- mutate(df, start = ymd(start), end = ymd(end))

# does not work - calculate overlap in days
df <- mutate(df, overlap = intersect(interval(my.start, my.end), interval(start, end)))
Run Code Online (Sandbox Code Playgroud)

结果应该是 0、5、4、12、0 天:

   my.start |-------------------------------| my.end

|-----| (0)
        |---------| (5)
                            |----| (4)
                                   |------------------| (12)
                                             |---------------| …
Run Code Online (Sandbox Code Playgroud)

r date overlap lubridate

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

lubridate :: interval对象中身份的评估错误

假设这样的df:

df <- data.frame(id = c(rep(1:5, each = 2)),
time1 = c("2008-10-12", "2008-08-10", "2006-01-09", "2008-03-13", "2008-09-12", "2007-05-30", "2003-09-29","2003-09-29", "2003-04-01", "2003-04-01"),
time2 = c("2009-03-20", "2009-06-15", "2006-02-13", "2008-04-17", "2008-10-17", "2007-07-04", "2004-01-15", "2004-01-15", "2003-07-04", "2003-07-04"))

   id      time1      time2
1   1 2008-10-12 2009-03-20
2   1 2008-08-10 2009-06-15
3   2 2006-01-09 2006-02-13
4   2 2008-03-13 2008-04-17
5   3 2008-09-12 2008-10-17
6   3 2007-05-30 2007-07-04
7   4 2003-09-29 2004-01-15
8   4 2003-09-29 2004-01-15
9   5 2003-04-01 2003-07-04
10  5 2003-04-01 2003-07-04
Run Code Online (Sandbox Code Playgroud)

我尝试做的是,首先lubridate在变量“ time1”和“ time2”之间创建一个间隔。其次,我要按“ …

r lubridate tidyverse

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

将日期时间列拆分为 R 中的部分

我有一个带有日期时间列的数据框。我想将该列拆分为多列:yearmonthdaytime_12time_24timezone

和需要分别是使用 12 小时约定和 24 小时约定的字符向量time_12time_24我怎样才能做到这一点?

library(tidyverse)
library(lubridate)

# data frame

myDates <- ymd_hm(c('2018-October-31 8:00 PM',
                    '2018Oct31T20:00'))

df <- data.frame(datetime = myDates)

# split datetime into parts

df$year <- year(df$datetime)
df$month <- month(df$datetime)
df$day <- day(df$datetime)
df$time_12 <- '8:00 PM'  ### need help
df$time_24 <- '20:00'    ### need help
df$tz <- tz(df$datetime)

df

# datetime              year month day time_12 time_24  tz
# 1 2018-10-31 …
Run Code Online (Sandbox Code Playgroud)

r lubridate

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

如何获得一周内的所有天数?

我有一个时期,我想将周一到周日分成几个星期。

使用lubridate,我可以查询日期的周数:

library(lubridate)
td = today()
week(td) #48
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到属于 2020 年第 48 周的所有日子?

r week-number lubridate

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

在 R 中使用 round_date() 舍入日期

我尝试在 R 中仅在 yyyy 中转换日期格式 yyyymmdd。如何在 R 中的日期中仅转换数字年份?提出了一个非常有趣的答案,因为它设法让 R 理解将润滑包中的 8 位数条目 (yyyymmdd) 转换为 4 位数年份 (yyyy),这对我来说非常好。

在我用于round_date()它的旧代码中:

   date2<-c('01/01/2000','08/08/2000','16/03/2001','25/12/2000','29/02/2000')
    name<-c('A','B','C','D','E')
    
    df<-data.frame(date2,name)
    
    df2 <- df %>%
      mutate(date2 = dmy(date2)) %>%
      mutate(year_date = round_date(date2,'year'))
    
    df2
    str(df2)

date2<date> name<chr> year_date <date>
2000-01-01    A         2000-01-01      
2000-08-08    B         2001-01-01      
2001-03-16    C         2001-01-01      
2000-12-25    D         2001-01-01      
2000-02-29    E         2000-01-01  
Run Code Online (Sandbox Code Playgroud)

但是当我发现例如日期 2000-08-08 被四舍五入到 2001-01-01 而不是 2001-01-01 时,我的统计分析开始出现问题。

这对我来说是一个非常大的问题,因为考虑到我的数据库中有 1400 多行,属于 2005 年的信息已移至 2006 年。

我注意到年中(六月之后)之后的日期被四舍五入到下一年,这非常糟糕。

如何将 2000-08-08 日期四舍五入到 2000 而不是 2001?

r lubridate

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

将每年的时间点与 R 中过去 365 天的数据进行匹配

我正在尝试合并两个数据集。调查数据集由不同地区的生物多样性调查组成,每1-5年在某个月份进行一次(该月份在地区内固定,但地区之间不固定)。温度数据集由每个调查区域的每日温度读数组成。

对于具有不同开始月份和时间范围的多项调查,我想将每个调查*年份组合与其之前的十二个月的温度数据配对。换句话说,我想将 1983 年 5 月的调查与其之前 12 个月(或 365 天——我不在乎是哪一天)的每日温度记录(截至 1983 年 4 月 30 日)配对。同时,其他地方于 8 月进行的另一项调查1983 年需要与截至 1983 年 7 月 31 日的 365 天温度数据配对。

(至少)有两种方法可以做到这一点——一种是将调查数据与(较长的)温度数据结合起来,然后以某种方式子集化或识别哪些日期属于调查日期之前的 12 个月。另一个方法是从调查数据开始,尝试将温度数据与矩阵列的每一行配对——我尝试使用 和 的时间序列工具执行此操作,tsibbletsModel无法让它“滞后”正确的值按地区分组。

我能够创建一个标识符来加入数据集,以便温度数据中的每个日期都与后续调查及时匹配。然而,并非所有这些都在 365 天内(例如,在下面创建的数据集中,日期1983-06-03与 ref_year 匹配aleutian_islands-5-1986,因为调查每 3-5 年才进行一次)。

以下是我想要的单个区域行为的一些示例(来自下面的示例数据集),尽管我愿意接受实现相同目标但看起来并不完全像这样的解决方案:

对于这一行,我想要生成的新列 ( ref_match) 中的值应该是 NA;该日期早于 365 天ref_year

  region           date        year month month_year ref_year                temperature     
  <chr>            <date>     <dbl> <dbl> <chr>      <chr>                         <dbl>
1 aleutian_islands 1982-06-09  1982     6 6-1982     aleutian_islands-5-1983           0 …
Run Code Online (Sandbox Code Playgroud)

r date time-series lubridate tidyverse

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