我已经阅读了一系列事件发生的37个日期和时间.它现在作为POSIXlt对象.我想要一个图形表示事件发生在每一天的时间.所以x轴应该是日期,y轴应该是一天中的时间.
然后我试着用ggplot2绘制它
qplot(day(dttm), hour(dttm))
Run Code Online (Sandbox Code Playgroud)
这就是我想要的东西,但它没有分钟的分辨率.如何在y轴中包含小时和分钟?
这是一些示例数据
dttm
[1] "2011-11-16 10:39:20" "2011-11-16 10:56:32" "2011-11-16 11:52:43" "2011-11-16 12:10:42"
[5] "2011-11-16 13:10:13" "2011-11-16 13:41:10" "2011-11-16 13:48:07" "2011-11-16 14:54:04"
[9] "2011-11-17 07:05:23" "2011-11-17 07:34:24" "2011-11-17 07:53:01" "2011-11-17 07:57:04"
[13] "2011-11-17 08:09:16" "2011-11-17 08:23:43" "2011-11-17 10:20:54" "2011-11-17 10:45:13"
[17] "2011-11-17 10:49:32" "2011-11-17 11:16:08" "2011-11-17 11:24:05" "2011-11-17 11:50:11"
[21] "2011-11-17 11:52:47" "2011-11-17 11:54:42" "2011-11-17 11:55:25" "2011-11-17 11:57:34"
[25] "2011-11-17 12:06:15" "2011-11-17 12:08:05" "2011-11-17 12:08:33" "2011-11-17 12:30:13"
[29] "2011-11-17 13:24:41" "2011-11-17 13:44:41" "2011-11-17 13:48:55" "2011-11-17 14:59:08"
[33] …Run Code Online (Sandbox Code Playgroud) 我想要一个计算每月特定天数的函数.
即.2013年11月 - > 5周五..而13年12月将返回4周五..
有一个优雅的功能会返回这个?
library(lubridate)
num_days <- function(date){
x <- as.Date(date)
start = floor_date(x, "month")
count = days_in_month(x)
d = wday(start)
sol = ifelse(d > 4, 5, 4) #estimate that is the first day of the month is after Thu or Fri then the week will have 5 Fridays
sol
}
num_days("2013-08-01")
num_days(today())
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法来做到这一点?
我开始使用lubridate包收到此错误消息:
as.Date(ymd_hms("2014-1-1 12:31:15"))
Run Code Online (Sandbox Code Playgroud)
.Call中的错误("parse_dt",x,格式,TRUE):"parse_dt"未从当前命名空间解析(lubridate)
我之前从未遇到过这种情况,我只能lubridate在长脚本中使用深度(实际包中有几个嵌套函数)时才会创建此错误- 我不知道哪一行导致了问题(我已经调试了几个小时)现在没有任何运气).
而且,它似乎只发生在我使用Rstudio时,而不是在Rgui中运行相同的代码时.
一旦发生,我必须重新启动R lubridate才能再次工作.此外,在它发生后,我在我的全球环境中有这个对象:
> ls()
[1] "oldLC"
> oldLC
[1] "English_Australia.1252"
Run Code Online (Sandbox Code Playgroud)
我知道我应该发布可以复制的错误,但我不能自己重现这一点,我希望指针在哪里看!
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_Australia.1252 LC_CTYPE=English_Australia.1252
[3] LC_MONETARY=English_Australia.1252 LC_NUMERIC=C
[5] LC_TIME=English_Australia.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] HIEv_0.3 RODBC_1.3-10 maptools_0.8-27 sp_1.0-14 stringr_0.6.2
[6] plyr_1.8 RCurl_1.95-4.1 bitops_1.0-6 rjson_0.2.13 lubridate_1.3.3
[11] roxygen2_3.0.0
loaded via a namespace (and not attached):
[1] brew_1.0-6 codetools_0.2-8 digest_0.6.4 foreign_0.8-57 grid_3.0.2 …Run Code Online (Sandbox Code Playgroud) 是否有lubridate提取周数的功能?我试图寻找,但找不到任何有用的目的.
该week()功能做了不同的事情.
描述
日期时间必须是POSIXct,POSIXlt,Date,chron,yearmon,yearqtr,zoo,zooreg,timeDate,xts,> its,ti,jul,timeSeries和fts对象.周数是在日期和1月1日之间发生的完整七天期间的数量加一.isoweek返回ISO 8601系统中出现的一周,该系统使用了一个reoccuring闰周.
关于R.中日期的快速提问.看看这段代码:
Sys.Date() - months(3)
# [1] "2013-12-31"
Sys.Date() - months(18)
# [1] NA
Run Code Online (Sandbox Code Playgroud)
我已经加载了包lubridate并按照提供的说明进行操作,我无法理解这种行为.它过去工作得很好,今天是我注意到从今天的日期NA减去超过12个月的第一天(减去不到12个月的工作正常).
我很感激,如果有人能够向我解释为什么这不起作用,和/或建议一个更"强大"的方式.它与今天是本月的最后一天(第31天)有关吗?
我问,因为这有效:
Sys.Date() - years(2)
# [1] "2012-03-31"
Run Code Online (Sandbox Code Playgroud) 我写了这个我一直用的功能:
# Give the previous day, or Friday if the previous day is Saturday or Sunday.
previous_business_date_if_weekend = function(my_date) {
if (length(my_date) == 1) {
if (weekdays(my_date) == "Sunday") { my_date = lubridate::as_date(my_date) - 2 }
if (weekdays(my_date) == "Saturday") { my_date = lubridate::as_date(my_date) - 1 }
return(lubridate::as_date(my_date))
} else if (length(my_date) > 1) {
my_date = lubridate::as_date(sapply(my_date, previous_business_date_if_weekend))
return(my_date)
}
}
Run Code Online (Sandbox Code Playgroud)
当我将其应用于具有数千行的数据帧的日期列时出现问题.这太慢了. 有什么想法为什么?
我正在使用包lubridate来解析异构格式化日期的向量并将它们转换为字符串,如下所示:
parse_date_time(c('12/17/1996 04:00:00 PM','4/18/1950 0130'), c('%m/%d/%Y %I:%M:%S %p','%m/%d/%Y %H%M'))
Run Code Online (Sandbox Code Playgroud)
这是结果:
[1] NA NA
Warning message:
All formats failed to parse. No formats found.
Run Code Online (Sandbox Code Playgroud)
如果我删除%p第一个格式字符串,它错误地解析第一个日期字符串,仍然不解析第二个,如下所示:
[1] "1996-12-17 04:00:00 UTC" NA
Warning message:
1 failed to parse.
Run Code Online (Sandbox Code Playgroud)
字符串中的4PM时间在结果中解析为4AM.
有谁经历过这种奇怪的行为?
我正在分析由几个环境变量组成的复杂数据集中的时间模式以及来自各种动物物种的活动数据.这些数据已通过多个实验设置收集,每个设置的数据每分钟存储一次.该项目已经运行了几年,所以我的数据集相当大.
我的一个数据集的前几行看起来像这样:
> head(setup_01)
DateTime Film_number unused PIR Wheel Temperature LightOld LightDay LightNight LightUV IDnumbers error mouse shrew vole rat frog rest extra_info odour
1 2015-03-10 12:27:10 x 0 0 13.40 1471.34 -0.97 1331.29 700.42 no error 0 0 0 0 0 0 1
2 2015-03-10 12:28:10 x 0 0 13.43 1471.38 -1.07 1291.11 731.32 no error 0 0 0 0 0 0 1
3 2015-03-10 12:29:10 x 0 0 13.31 1471.24 -1.08 1368.57 1016.02 no error 0 0 0 …Run Code Online (Sandbox Code Playgroud) 我想在第 1 个月的两个指定时刻之间创建一个日期向量,如本主题中所述(创建两个日期之间的所有天数的向量),然后将其转换为用于数据可视化的因子。
但是,我想在 YYYY-Mon 中有日期,即。2010 年 2 月,格式。但到目前为止,我只设法使用标准格式 2010-02-01 的日期,使用这样的代码:
require(lubridate)
first <- ymd_hms("2010-02-07 15:00:00 UTC")
start <- ymd(floor_date(first, unit="month"))
last <- ymd_hms("2017-10-29 20:00:00 UTC")
end <- ymd(ceiling_date(last, unit="month"))
> start
[1] "2010-02-01"
> end
[1] "2017-11-01"
Run Code Online (Sandbox Code Playgroud)
如何将格式更改为 YYYY-Mon?
为什么这两个操作不同?
library(lubridate)
library(magrittr)
> seconds_to_period(1:1000) %>% cumsum %>% sum
[1] 14492440
> 1:1000 %>% cumsum %>% sum
[1] 167167000
Run Code Online (Sandbox Code Playgroud)
但是,我看到的问题是,该事实cumsum 仅增加了周期的秒数,而忽略了其余的时间:
seconds_to_period(60) + seconds_to_period(60)
[1] "2M 0S"
Run Code Online (Sandbox Code Playgroud)
但
> cumsum(c(seconds_to_period(60), seconds_to_period(60)))
[1] 0 0
Run Code Online (Sandbox Code Playgroud)
为什么此行为是默认形式?我认为这很不直观。此外,克服此问题并获得与cumsum(1:1000)使用“ Period”类润滑脂相同的结果的方法是什么,该方法不需要执行以下操作:
c(seconds_to_period(60), seconds_to_period(60)) %>% as.numeric %>% cumsum
lubridate ×10
r ×10
date ×5
datetime ×2
cumsum ×1
format ×1
ggplot2 ×1
r-maptools ×1
rstudio ×1
time-series ×1