我有这个日期列表:
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.
我有一个数据集,其中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.
我已经将刻度标签的格式切换为垂直格式,但它仍然过于拥挤.
任何提示将非常感谢.谢谢!
我怀疑我在做一些非常愚蠢的事情,但我无法让该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)。
我有以下数据集:
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
我正在尝试计算两个时间段之间重叠的天数。一个周期固定在开始和结束日期,另一个在数据框中记录为开始和结束日期。
编辑:我正在处理具有发布日期 (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) 假设这样的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”之间创建一个间隔。其次,我要按“ …
我有一个带有日期时间列的数据框。我想将该列拆分为多列:year、month、day、time_12、time_24和timezone。
和需要分别是使用 12 小时约定和 24 小时约定的字符向量time_12。time_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) 我有一个时期,我想将周一到周日分成几个星期。
使用lubridate,我可以查询日期的周数:
library(lubridate)
td = today()
week(td) #48
Run Code Online (Sandbox Code Playgroud)
我怎样才能找到属于 2020 年第 48 周的所有日子?
我尝试在 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?
我正在尝试合并两个数据集。调查数据集由不同地区的生物多样性调查组成,每1-5年在某个月份进行一次(该月份在地区内固定,但地区之间不固定)。温度数据集由每个调查区域的每日温度读数组成。
对于具有不同开始月份和时间范围的多项调查,我想将每个调查*年份组合与其之前的十二个月的温度数据配对。换句话说,我想将 1983 年 5 月的调查与其之前 12 个月(或 365 天——我不在乎是哪一天)的每日温度记录(截至 1983 年 4 月 30 日)配对。同时,其他地方于 8 月进行的另一项调查1983 年需要与截至 1983 年 7 月 31 日的 365 天温度数据配对。
(至少)有两种方法可以做到这一点——一种是将调查数据与(较长的)温度数据结合起来,然后以某种方式子集化或识别哪些日期属于调查日期之前的 12 个月。另一个方法是从调查数据开始,尝试将温度数据与矩阵列的每一行配对——我尝试使用 和 的时间序列工具执行此操作,tsibble但tsModel无法让它“滞后”正确的值按地区分组。
我能够创建一个标识符来加入数据集,以便温度数据中的每个日期都与后续调查及时匹配。然而,并非所有这些都在 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) lubridate ×10
r ×10
date ×3
ggplot2 ×2
tidyverse ×2
character ×1
density-plot ×1
dst ×1
overlap ×1
plot ×1
time-series ×1
timezone ×1
week-number ×1