如何从丢弃日期部分的一系列POSIXct对象中提取时间?
例如,我有:
times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979,
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059,
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct",
"POSIXt"))
Run Code Online (Sandbox Code Playgroud)
对应于这些日期:
"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET"
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET"
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"
Run Code Online (Sandbox Code Playgroud)
现在,我有一些在这些时间测量的参数值
val <- c(1.25343125e-05, 0.00022890575,
3.9269125e-05, 0.0002285681875,
4.26353125e-05, 5.982625e-05,
2.09575e-05, 0.0001516951251,
2.653125e-05, 0.0001021391875)
Run Code Online (Sandbox Code Playgroud)
我想绘制val与当天的时间,而不考虑测量val的具体日期.
是否有一个特定的功能可以让我这样做?
我认为R错误地使用小数秒格式化POSIXct类型.我通过R-bugs提交了这个作为增强请求的内容,并且"我们认为当前的行为是正确的 - 删除了bug".虽然我非常感谢他们已经完成并将继续做的工作,但我想让其他人对这个特定问题采取行动,并且可能就如何更有效地提出要点提出建议.
这是一个例子:
> tt <- as.POSIXct('2011-10-11 07:49:36.3')
> strftime(tt,'%Y-%m-%d %H:%M:%OS1')
[1] "2011-10-11 07:49:36.2"
Run Code Online (Sandbox Code Playgroud)
也就是说,tt创建为POSIXct时间,小数部分.3秒.当使用一个十进制数字打印时,显示的值为.2.我使用毫秒级精度的时间戳工作很多,这让我很烦恼,因为时间通常比实际值低一个等级.
以下是发生的事情:POSIXct是自纪元以来的浮点秒数.精确处理所有整数值,但在base-2浮点中,与.3最接近的值略小于.3.strftime()
格式的所述行为%OSn
是向下舍入到请求的小数位数,因此显示的结果为.2.对于其他小数部分,浮点值略高于输入的值,显示屏给出预期结果:
> tt <- as.POSIXct('2011-10-11 07:49:36.4')
> strftime(tt,'%Y-%m-%d %H:%M:%OS1')
[1] "2011-10-11 07:49:36.4"
Run Code Online (Sandbox Code Playgroud)
开发人员的论点是,对于时间类型,我们应该总是向下舍入到请求的精度.例如,如果时间是11:59:59.8,那么用格式打印它%H:%M
应该给出"11:59"而不是"12:00",并且%H:%M:%S
应该给出"11:59:59"而不是"12:00:00".我同意这个整数秒和格式标志%S
,但我认为对于为小数部分秒设计的格式标志,行为应该是不同的.我希望看到%OSn
使用舍入到最近的行为,即使是n = 0
同时%S
使用循环下来,从而使打印11:59:59.8与格式%H:%M:%OS0
将给"12:00:00".这不会影响整数秒的任何事情,因为它们总是精确地表示,但它会更自然地处理小数秒的舍入误差.
这就是如何处理小数部分的打印,例如C,因为整数转换向下舍入:
double x = 9.97;
printf("%d\n",(int) x); // 9
printf("%.0f\n",x); // 10
printf("%.1f\n",x); // 10.0
printf("%.2f\n",x); // 9.97
Run Code Online (Sandbox Code Playgroud)
我做了一个关于如何在其他语言和环境中处理小数秒的快速调查,并且似乎确实没有达成共识.大多数构造设计为整数秒,而小数部分是事后想法.在我看来,在这种情况下,R开发人员做出的选择并非完全不合理,但实际上并不是最好的选择,并且与其他地方用于显示浮点数的约定不一致.
人们的想法是什么?R行为是否正确?这是你自己设计它的方式吗?
我想向POSIXct对象添加1小时,但它不支持'+'.
这个命令:
as.POSIXct("2012/06/30","GMT")
+ as.POSIXct(paste(event_hour, event_minute,0,":"), ,"%H:%M:$S")
Run Code Online (Sandbox Code Playgroud)
返回此错误:
Error in `+.POSIXt`(as.POSIXct("2012/06/30", "GMT"), as.POSIXct(paste(event_hour, :
binary '+' is not defined for "POSIXt" objects
Run Code Online (Sandbox Code Playgroud)
如何为POSIXct对象添加几个小时?
我正在玩很多关于我正在建造的包裹的日期和时间.
在这篇文章中磕磕绊绊地再次提醒我,在转向contrib包之前,查看是否可以使用基本R功能完成某些操作通常并不是一个坏主意.
因此,是否可以POSIXct
使用基本R功能来舍入课程日期?
我检查了
methods(round)
Run Code Online (Sandbox Code Playgroud)
"只"给了我
[1] round.Date round.timeDate*
Non-visible functions are asterisked
Run Code Online (Sandbox Code Playgroud)
这是我想做的(伪代码)
x <- as.POSIXct(Sys.time())
[1] "2012-07-04 10:33:55 CEST"
round(x, atom="minute")
[1] "2012-07-04 10:34:00 CEST"
round(x, atom="hour")
[1] "2012-07-04 11:00:00 CEST"
round(x, atom="day")
[1] "2012-07-04 CEST"
Run Code Online (Sandbox Code Playgroud)
我知道这可以用timeDate,lubridate等来完成,但是我想保持包依赖性.所以在继续检查相应软件包的源代码之前,我想我会问有人已经做过这样的事情了.
R有is.vector
,is.list
,is.integer
,is.double
,is.numeric
,is.factor
,is.character
,等为什么没有is.POSIXct
,is.POSIXlt
还是is.Date
?
我需要一种可靠的方法来检测POSIXct
物体,class(x)[1] == "POSIXct"
看起来真的......很脏.
我想制作一个空的矢量,POSIXct
以便我可以放入POSIXct
其中:
vec <- vector("POSIXct", 10)
vec
vec[1] <- "2014-10-27 18:11:36 PDT"
vec
Run Code Online (Sandbox Code Playgroud)
这不起作用.有任何想法吗?
考虑格式的字符串
test <- "YYYY-MM-DDT00:00:00.000-08:00"
Run Code Online (Sandbox Code Playgroud)
我的目标是将这些字符串转换为POSIXct
格式,以便我可以绘制数据.我最初的想法是使用
as.POSIXct(test)
Run Code Online (Sandbox Code Playgroud)
...但这似乎将日期时间截断为日期.有什么想法吗?帮助信息as.POSIXct
似乎暗示输入应该是由空格分隔的日期和时间,而不是"T".这是我的问题吗?
我的目标是在给定开始,结束和增量(15分钟,1小时,1天)的情况下创建POSIXct时间戳的向量.我希望我可以使用seq
它,但我在数字和POSIXct表示之间转换时遇到问题:
now <- Sys.time()
now
# [1] "2012-01-19 10:30:39 CET"
as.POSIXct(as.double(now), origin="1970-01-01", tz="CET")
# [1] "2012-01-19 09:30:39 CET"
as.POSIXct(as.double(now), origin=as.POSIXct("1970-01-01", tz="CET"), tz="CET")
# [1] "2012-01-19 09:30:39 CET"
Run Code Online (Sandbox Code Playgroud)
转换期间会丢失一小时.我究竟做错了什么?
我在将POSIXct转换为字符并返回到R中的POSIXct时遇到问题.我运行以下代码:
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- as.character(time_seq_01)
time_seq_03 <- as.POSIXct(time_seq_02)
Run Code Online (Sandbox Code Playgroud)
或同等学历:
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10)
time_seq_02 <- format(time_seq_01,usetz = TRUE)
time_seq_03 <- as.POSIXct(time_seq_02)
Run Code Online (Sandbox Code Playgroud)
这是2012年从中欧夏令时(CEST)到中欧时间(CET)的夏令时转换(10月02:00 - 03:00的最后一个星期日)的时间戳.
当我把这些元素称为时,我得到了
time_seq_01
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST"
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST"
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET"
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET"
[9] "2012-10-28 03:00:00 CET" "2012-10-28 …
Run Code Online (Sandbox Code Playgroud) 我试图解决的问题是我有一个数据框,其中包含一个排序的POSIXct变量.每行都被分类,我想获得每个级别的每一行之间的时间差异,并将该数据添加回一个新变量.可重现的问题如下.以下功能仅用于为此问题创建具有随机时间的样本数据.
random.time <- function(N, start, end) {
st <- as.POSIXct(start)
en <- as.POSIXct(end)
dt <- as.numeric(difftime(en, st, unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
return(rt)
}
Run Code Online (Sandbox Code Playgroud)
模拟问题的代码如下:
set.seed(123)
category <- sample(LETTERS[1:5], 20, replace=TRUE)
randtime <- random.time(20, '2015/06/01 08:00:00', '2015/06/01 18:00:00')
df <- data.frame(category, randtime)
Run Code Online (Sandbox Code Playgroud)
预期的结果数据框如下:
>category randtime timediff (secs)
>A 2015-06-01 09:05:00 0
>A 2015-06-01 09:06:30 90
>A 2015-06-01 09:10:00 210
>B 2015-06-01 10:18:58 0
>B 2015-06-01 10:19:58 60
>C 2015-06-01 08:14:00 0
>C 2015-06-01 08:16:30 …
Run Code Online (Sandbox Code Playgroud)