请考虑以下示例
library(tidyverse)
library(lubridate)
time <- seq(from =ymd("2014-02-24"),to= ymd("2014-03-20"), by="days")
set.seed(123)
values <- sample(seq(from = 20, to = 50, by = 5), size = length(time), replace = TRUE)
df2 <- data_frame(time, values)
df2 <- df2 %>% mutate(day_of_week = wday(time, label = TRUE))
Source: local data frame [25 x 3]
time values day_of_week
<date> <dbl> <fctr>
1 2014-02-24 30 Mon
2 2014-02-25 45 Tues
3 2014-02-26 30 Wed
4 2014-02-27 50 Thurs
5 2014-02-28 50 Fri
6 2014-03-01 20 Sat
7 2014-03-02 …Run Code Online (Sandbox Code Playgroud) 我无法理解如何在lubridate中使用guess_formats函数.我有一些日期的矢量以一些未知的格式/顺序排列.我想将它们转换为Date对象(或至少转换为尽可能多的对象).以下代码是我尝试过的:
library(lubridate)
sampleDates <- c("4/6/2004","4/6/2004","4/6/2004","4/7/2004",
"4/6/2004","4/7/2004","2014-06-28","2014-06-30","2014-07-12",
"2014-07-29","2014-07-29","2014-08-12")
formats <- guess_formats(sampleDates, c("Ymd", "mdY"))
dates <- as.Date(sampleDates, format=formats)
Run Code Online (Sandbox Code Playgroud)
这给了所有NA.
这显然只是一个简短的例子.在实际情况中,我不知道各种格式散布在哪里,我不会100%确定只有%m /%d /%Y和%Y-%m-%d.有人能让我知道A.在这个例子中如何使用guess_formats或者B.有更适合在lubridate/base R中使用的东西,希望没有很多正则表达式.谢谢!
编辑:我也尝试过parse_date_time.我不明白的是这个例子的以下工作:
parse_date_time(sampleDates,
orders = c("Ymd", "mdY"),
locale = "eng")
Run Code Online (Sandbox Code Playgroud)
但这不是:
parse_date_time(sampleDates,
orders = c("mdY", "Ydm"),
locale = "eng")
Run Code Online (Sandbox Code Playgroud)
在我的实际数据集中,我不知道格式的顺序,这似乎对此函数很重要.
双重编辑:Dur,好的,我看到我在第一个parse_date_time示例中有Ymd而在第二个中有Ydm ...继续.
所以我有一个数据框,它有一个日期列,一个小时列和一系列其他数字列.数据框中的每一行是一整天的1小时1天.
数据框如下所示:
Date Hour Melbourne Southern Flagstaff
1 2009-05-01 0 0 5 17
2 2009-05-01 2 0 2 1
3 2009-05-01 1 0 11 0
4 2009-05-01 3 0 3 8
5 2009-05-01 4 0 1 0
6 2009-05-01 5 0 49 79
7 2009-05-01 6 0 425 610
Run Code Online (Sandbox Code Playgroud)
小时数无序,因为这是从另一个数据框中的子集.
我想按月和可能按天将数值中的值相加.有谁知道我怎么做到这一点?
我已经阅读了一系列事件发生的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) 我有一些字符向量,其中包含各种格式的日期
dates <- c("23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
Run Code Online (Sandbox Code Playgroud)
我想将这些转换为日期.我从lubridate包中尝试过非常好的dmy,但这不起作用:
dmy(dates)
[1] "0012-11-23 UTC" "2012-10-20 UTC" "2012-10-22 UTC" "0012-11-23 UTC"
Run Code Online (Sandbox Code Playgroud)
它将/ 12年视为0012.
所以我现在尝试使用正则表达式来选择每种类型,并使用as.Date()单独转换为日期.但是我试图选择dd/mm/yy的正则表达式不起作用.
dates[grep('[0-9]{2}/[0-9]{2}/[0-9]{2,2}', dates)]
Run Code Online (Sandbox Code Playgroud)
回报
[1] "23/11/12" "20/10/2012" "22/10/2012" "23/11/12"
Run Code Online (Sandbox Code Playgroud)
我认为{2,2}应该得到正好2个数字,而不是所有数字.我不是很擅长正则表达,所以任何帮助将不胜感激.
谢谢
编辑
我实际拥有的是三种不同类型的日期,如下所示
dates <- c("23-Jul-2013", "23/11/12", "20/10/2012", "22/10/2012" ,"23/11/12")
Run Code Online (Sandbox Code Playgroud)
我想将这些转换为日期
parse_date_time(dates,c('dmy'))
Run Code Online (Sandbox Code Playgroud)
给我
[1] "2013-07-23" "0012-11-23" "2012-10-20" "2012-10-22" "0012-11-23"
Run Code Online (Sandbox Code Playgroud)
然而,这是错误的,0012应该是2012年.我想(一个相当简单的)解决方案.
我现在拥有的一个解决方案(感谢@plannapus)是使用正则表达式我实际上最终创建了这个函数,因为我仍然得到一些情况,其中rubridate方法将12变为0012
asDateRegex <- function(dates,
#selects strings from the vector dates using regexes and converts these to Dates
regexes = c('[0-9]{2}/[0-9]{2}/[0-9]{4}', #dd/mm/yyyy
'[0-9]{2}/[0-9]{2}/[0-9]{2}$', #dd/mm/yy
'[0-9]{2}-[[:alpha:]]{3}-[0-9]{4}'), #dd-mon-yyyy
orders = 'dmy',
...){
require(lubridate) …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闰周.
我正在尝试提供一些代码来查看日期,然后将其分配给会计年度.我完全陷入了困境.
我有一个包含POSIXct格式的日期的变量:
df$Date
#2015-05-01 CST
#2015-04-30 CST
#2014-09-01 CST
Run Code Online (Sandbox Code Playgroud)
我需要做的是采取这些日期并返回从5月1日到4月30日的财政年度.例如,2016财年运行2015-05-01到2016-04-30.结果看起来像这样:
df$Date df$FiscalYear
#2015-05-01 CST #FY2016
#2015-04-30 CST #FY2015
#2014-09-01 CST #FY2015
Run Code Online (Sandbox Code Playgroud)
有没有简单的方法来做到这一点?
当我在RI中运行以下代码时会得到一个奇怪的注释(它只在我第一次在会话中运行代码时出现):
> library(lubridate)
Attaching package: ‘lubridate’
The following object is masked from ‘package:base’:
date
Warning message:
package ‘lubridate’ was built under R version 3.3.2
> data.frame(i = interval(ymd(20140101), ymd(20160101)))$i %/% years(1)
Note: method with signature ‘Timespan#Timespan’ chosen for function ‘%/%’,
target signature ‘Interval#Period’.
"Interval#ANY", "ANY#Period" would also be valid
[1] 2
Run Code Online (Sandbox Code Playgroud)
我倍感困惑:
我正在尝试找到重叠的间隔,并决定将间隔数据加入到自身中,dplyr::left_join()以便我可以将间隔与lubridate::int_overlaps()每个其他间隔进行比较.
这是我期望left_join()的表现方式.两个tibbles具有三行交叉以形成tibble与9行:
library(tidyverse)
tibble(a = rep("a", 3), b = rep(1, 3)) %>%
left_join(tibble(a = rep("a", 3), c = rep(2, 3)))
Joining, by = "a"
# A tibble: 9 x 3
a b c
<chr> <dbl> <dbl>
1 a 1 2
2 a 1 2
3 a 1 2
4 a 1 2
5 a 1 2
6 a 1 2
7 a 1 2
8 a 1 2
9 a 1 2 …Run Code Online (Sandbox Code Playgroud)