假设我有以下内容 data.frame
foo
start.time duration
1 2012-02-06 15:47:00 1
2 2012-02-06 15:02:00 2
3 2012-02-22 10:08:00 3
4 2012-02-22 09:32:00 4
5 2012-03-21 13:47:00 5
Run Code Online (Sandbox Code Playgroud)
并class(foo$start.time)
返回
[1] "POSIXct" "POSIXt"
Run Code Online (Sandbox Code Playgroud)
我想创建一个foo$duration
v.的情节foo$start.time
.在我的场景中,我只对一天中的时间而不是一年中的实际日期感兴趣.如何将一天中的时间提取为几小时:来自POSIXct
矢量类的秒数?
嗨,我正在尝试用lubridate获取一系列日期
这不起作用
seq(ymd('2012-04-07'),ymd('2013-03-22'),by=week(1))
Run Code Online (Sandbox Code Playgroud)
基本命令
seq(as.Date('2012-04-7'),as.Date('2013-03-22'),'weeks')
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否有一种优雅的方式与lubridate这样做.
编辑
请忽略:解决自己,所以只留下后人.很高兴在必要时将其删除.
seq(ymd('2012-04-07'),ymd('2013-03-22'),by='weeks')
Run Code Online (Sandbox Code Playgroud)
诀窍
在R中有一个简单的方法可以逐项列出在两个指定日期之间发生的所有有效日期吗?例如,我想要以下输入:
itemizeDates(startDate="12-30-11", endDate="1-4-12")
Run Code Online (Sandbox Code Playgroud)
生成以下日期:
"12-30-11" "12-31-11", "1-1-12", "1-2-12", "1-3-12", "1-4-12"
Run Code Online (Sandbox Code Playgroud)
我对日期的类和格式很灵活,我只需要实现这个概念.
我使用lubridate并认为这将是如此简单
ymd("2010-01-31")+months(0:23)
Run Code Online (Sandbox Code Playgroud)
但看看会得到什么.这一切都搞砸了!
[1] "2010-01-31 UTC" "2010-03-03 UTC" "2010-03-31 UTC" "2010-05-01 UTC" "2010-05-31 UTC" "2010-07-01 UTC" "2010-07-31 UTC" "2010-08-31 UTC" "2010-10-01 UTC"
[10] "2010-10-31 UTC" "2010-12-01 UTC" "2010-12-31 UTC" "2011-01-31 UTC" "2011-03-03 UTC" "2011-03-31 UTC" "2011-05-01 UTC" "2011-05-31 UTC" "2011-07-01 UTC"
[19] "2011-07-31 UTC" "2011-08-31 UTC" "2011-10-01 UTC" "2011-10-31 UTC" "2011-12-01 UTC" "2011-12-31 UTC"
Run Code Online (Sandbox Code Playgroud)
然后我读到了lubridate如何迎合间隔,持续时间和周期等现象.那么,好吧我知道一个月实际上是由(365*4 + 1)/ 48 = 30.438天定义的天数.所以我试图变得聪明并将其重写为
ymd("2010-01-31")+ as.period(months(0:23))
Run Code Online (Sandbox Code Playgroud)
但那只是一个错误.
Run Code Online (Sandbox Code Playgroud)Error in as.period.default(months(0:23)) : (list) object cannot be coerced to type 'double'
我正在使用csv,不幸的是,它使用42705的数字格式记录了日期时间,尽管它应该是2016年12月1日.
我想使用Lubridate或其他软件包将其转换为R中的正确格式.有没有能够处理它的功能?
如果日期向量具有两位数年份,则将mdy()
年份在00到68之间变为21世纪年份,将年份从69到99年变为20世纪年份.例如:
library(lubridate)
mdy(c("1/2/54","1/2/68","1/2/69","1/2/99","1/2/04"))
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
Multiple format matches with 5 successes: %m/%d/%y, %m/%d/%Y.
Using date format %m/%d/%y.
[1] "2054-01-02 UTC" "2068-01-02 UTC" "1969-01-02 UTC" "1999-01-02 UTC" "2004-01-02 UTC"
Run Code Online (Sandbox Code Playgroud)
我可以通过从不正确的日期减去100到2054和2068到1954年和1968年来解决这个问题.但是有一种更优雅且不易出错的解析两位数日期的方法,以便它们在正确处理解析过程本身?
更新:在@JoshuaUlrich指出我之后,strptime
我发现了这个问题,它解决了类似于我的问题,但是使用了基础R.
似乎R中日期处理的一个很好的补充是在日期解析函数中处理两位数日期的世纪选择截止值的某种方式.
我对R来说比较新,但这是我第一次不得不处理日期转换.我从CSV读取数据(使用read.table()),但我缩短了数据以突出显示我的问题.当读入R时,Date字段是字符.
简单地说,我的大多数日期都被正确强制,除了少数情况.下面的例子有望向您展示正在发生的事情.
# my attempt to coerce the date -- uses the stringr package
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1,
str_locate(prods.all$Date, " ")[1]-1),
"%m/%d/%Y")
# grab two rows to highlight my issue
temp <- prods.all[c(1925:1926), c(1,8)]
> temp
Date Date2
1925 10/9/2009 0:00:00 2009-10-09
1926 10/15/2009 0:00:00 0200-10-15
Run Code Online (Sandbox Code Playgroud)
如您所见,某些日期的年份不准确.当这一天是两位数时,似乎会出现这种模式.
我查看了几本书并尝试了Google更好的方法,但似乎所有内容都表明我的数据在输入时格式不正确.
鉴于R有多强大,我认为有一种非常简单的方法可以强制我的专栏成为有效的日期,而且我忽略了一个非常明显的解决方案.
我们将非常感谢您提供的任何帮助.
我正在使用该lubridate
软件包并应用该month
函数从日期中提取月份.我在日期字段上运行了str命令,我得到了
Factor w/ 9498 levels "01/01/1979","01/01/1980",..: 5305 1 1 1 1 1 1 1 1 1 ...
> v1$Date<-month(v1$Date)
Error in as.POSIXlt.character(as.character(x), ...) :
character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)
这是我的数据框的一个例子
https://drive.google.com/file/d/0B6cqWmwsEk20Q2dHblhXZi14Wk0/edit?usp=sharing
我不知道我做错了什么.
正如标题所说.为什么润滑剂的功能要慢得多?
library(lubridate)
library(microbenchmark)
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 50000, replace = TRUE)
microbenchmark(as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT"), times = 100)
microbenchmark(dmy(Dates, tz ="GMT"), times = 100)
Unit: milliseconds
expr min lq median uq max
1 as.POSIXct(Dates, format = "%d-%b-%Y %H:%M:%S", tz = "GMT") 103.1902 104.3247 108.675 109.2632 149.871
2 dmy(Dates, tz = "GMT") 184.4871 194.1504 197.8422 214.3771 268.4911
Run Code Online (Sandbox Code Playgroud) 我有一个rubridate, interval
并希望得到整数的天数.但是我得到以下奇怪的中间结果:
library("lubridate")
i1 <- interval("2015-01-01 00:00:00", "2016-01-01 00:00:00")
i1 <- interval(ymd_hms("2015-01-01 00:00:00"), ymd_hms("2016-01-01 00:00:00")) # Gives the same result
duration(i1)
# [1] "31536000s (~365 days)"
duration(i1, units = "days")
# [1] "2724710400000s (~86340.86 years)"
Run Code Online (Sandbox Code Playgroud)
这是两个有效的捷径.后者抛出一条消息"强迫间隔到持续时间"(我不知道原因......)
> as.numeric(as.duration(i1), units = "days")
[1] 365
> as.numeric(i1, units = 'days')
Run Code Online (Sandbox Code Playgroud)
(R版本3.3.0日期为2016-05-03,lubridate版本1.5.6.)