相关疑难解决方法(0)

R如何用小数秒格式化POSIXct

我认为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行为是否正确?这是你自己设计它的方式吗?

r posixct

56
推荐指数
2
解决办法
2万
查看次数

修改POSIXct对象的时区而不更改显示

我有一个POSIXct对象,并希望更改它的tz属性WITHOUT R来解释它(解释它将意味着改变日期时间在屏幕上的显示方式).

一些背景:我正在使用fasttime来自S.Urbanek 的包,它采用字符串并将其POSIXct快速投射.问题是字符串应该代表"GMT"中的日期时间,而不是我的数据的情况.

我最终得到一个POSIXct对象tz=GMT,实际上是tz=GMT+1,如果我改变时区

attr(datetime, "tzone") <- "Europe/Paris";
datetime  <- .POSIXct(datetime,tz="Europe/Paris"); 
Run Code Online (Sandbox Code Playgroud)

然后它将"显示"为GMT+2(基础值永远不会改变).

编辑:这是一个例子

datetime=as.POSIXct("2011-01-01 12:32:23.234",tz="GMT")
attributes(datetime)
#$tzone
#[1] "GMT"
datetime
#[1] "2011-01-01 12:32:23.233 GMT"
Run Code Online (Sandbox Code Playgroud)

如何在没有R的情况下更改此属性来解释它,又如何更改tzone并仍然显示日期时间"2011-01-01 12:32:23.233"

编辑/解决方案,@ GSee的解决方案相当快,lubridate :: force_tz非常慢

datetime=rep(as.POSIXct("2011-01-01 12:32:23.234",tz="GMT"),1e5)
f <- function(x,tz) return(as.POSIXct(as.numeric(x), origin="1970-01-01", tz=tz))
> system.time(datetime2 <- f(datetime,"Europe/Paris"))
   user  system elapsed 
   0.01    0.00    0.02 
> system.time(datetime3 <- force_tz(datetime,"Europe/Paris"))
   user  system elapsed 
   5.94    0.02    5.98 
identical(datetime2,datetime3)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

timezone r posixct

10
推荐指数
2
解决办法
7907
查看次数

在R中调用strptime时毫秒难题

options(digits.secs = 3);

> strptime("2007-03-30 15:00:00.007", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.007"
> strptime("2007-03-30 15:00:00.008", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.008"
> strptime("2007-03-30 15:00:00.009", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.008"
> strptime("2007-03-30 15:00:00.010", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.01"
> strptime("2007-03-30 15:00:00.011", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.010"
> strptime("2007-03-30 15:00:00.999", format = "%Y-%m-%d %H:%M:%OS");
[1] "2007-03-30 15:00:00.998"
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么与"009"有一毫秒的差异,然后再从"011"那里得到.

r strptime

6
推荐指数
1
解决办法
5525
查看次数

在R中为时间戳添加毫秒

我的时间戳管理存在问题.在我的数据集中,我有两个变量,即时间和相对时间.时间是HH:MM:SS.ss格式,而相对时间是数字变量,包含从0开始经过的秒数(即0.76,1.28,1.78,2.38 ......).为简单起见,让我们考虑一下假设情况:

Time <- c("09:33:23.00", "09:35:25.00", "09:36:26.00")
RTime <- c(0.78, 1.28, 3.98)

然后我执行以下操作来添加毫秒时间:

ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1),format="%H:%M:%OS2")

我希望它能产生:
"09:33:23.78" "09:35:25.28" "09:36:26.98"

但我得到以下结果:
"09:33:23.77" "09:35:25.27" "09:36:26.98"

大部分时间它只有一毫秒.我不明白为什么这样做.我可以在strptime函数中添加0.01 ,即(RTime %% 1) + 0.01.但是我没有发现那么优雅,更重要的是,正如你在上面的例子中看到的那样,它并不总是0.01关 - 就像最后一例一样.有关正在发生的事情的任何提示,或者可能是改进代码的建议?

干杯

[求助]
编辑:感兴趣.这就是我最终解决问题的方法:

ATime <- strftime(strptime(Time,format="%H:%M:%OS")+(RTime %% 1)+0.005,format="%H:%M:%OS2")

这会"强制"舍入而不是截断,这导致了毫秒的差异.
感谢@Josh O'Brien和@nrussell的评论!

datetime r

5
推荐指数
1
解决办法
1151
查看次数

在 R 中,%OSn 时间格式是否仅对格式化有效,但对解析无效?

考虑这个 R 代码,它使用定义的时间格式字符串(下面的 timeFormat 变量)来格式化和解析日期:


time = as.POSIXct(1433867059, origin = "1970-01-01")
print(time)
print( as.numeric(time) )

timeFormat = "%Y-%m-%d %H:%M:%OS3"
tz = "EST"

timestamp = format(time, format = timeFormat, tz = tz)
print(timestamp)

timeParsed = as.POSIXct(timestamp, format = timeFormat, tz = tz)
print(timeParsed)
print( as.numeric(timeParsed) )
Run Code Online (Sandbox Code Playgroud)

如果我将其粘贴到运行最新 (3.2.0) 稳定版本的 Windows 机器上的 Rgui 中,我会得到以下信息:


> time = as.POSIXct(1433867059, origin = "1970-01-01")
> print(time)
[1] "2015-06-09 12:24:19 EDT"
> print( as.numeric(time) )
[1] 1433867059
> 
> timeFormat = "%Y-%m-%d %H:%M:%OS3"
> tz = …
Run Code Online (Sandbox Code Playgroud)

format parsing r posixct

5
推荐指数
1
解决办法
996
查看次数

时间戳 R 序列毫秒

我之前问过一个问题(请参阅:带毫秒的时间戳序列)但是由于某种原因,当我的时间从 00:00:00 开始时,我的代码不起作用。

我想从一个时间到另一个时间获得 10hz 时间的序列。但是这段代码给了我:

1   2018-06-01 00:00:00.000
2   2018-06-01 00:00:00.101
3   2018-06-01 00:00:00.202
4   2018-06-01 00:00:00.303
5   2018-06-01 00:00:00.404
Run Code Online (Sandbox Code Playgroud)

当我需要时:

1   2018-06-01 00:00:00.000
2   2018-06-01 00:00:00.100
3   2018-06-01 00:00:00.200
4   2018-06-01 00:00:00.300
5   2018-06-01 00:00:00.400
Run Code Online (Sandbox Code Playgroud)

代码:

options(digits.secs=3)
Time1 ="2018-06-01 00:00:00"
Time2 ="2018-06-01 00:00:10"
Time1 =as.POSIXct(Time1, format="%Y-%m-%d %H:%M:%OS", tz='UTC')
Time2 =as.POSIXct(Time2, format="%Y-%m-%d %H:%M:%OS", tz='UTC')
library(stringr)
dif_T2_T1 <- difftime(Time1, Time2, units = 'secs')
pattern <- '(\\d)+'
n <- as.numeric(str_extract(dif_T2_T1, pattern = pattern)) * 10
df_blank  <- data.frame(Timestamp = …
Run Code Online (Sandbox Code Playgroud)

r

5
推荐指数
1
解决办法
129
查看次数

标签 统计

r ×6

posixct ×3

datetime ×1

format ×1

parsing ×1

strptime ×1

timezone ×1