考虑到以下问题,在R.下舍入毫秒数.如何绕过它以便时间正确?
> options(digits.secs=3)
> as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.060 UTC"
> as.POSIXlt("13:29:56.062", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.061 UTC"
> as.POSIXlt("13:29:56.063", format='%H:%M:%OS', tz='UTC')
[1] "2012-06-07 13:29:56.063 UTC"
Run Code Online (Sandbox Code Playgroud)
我注意到这个URL提供了背景信息,但没有解决我的问题: 在R中调用strptime时毫秒难题.
此URL也触及该问题但未解决此问题:R xts:索引中的.001毫秒.
在这些情况下,我确实看到以下内容:
> x <- as.POSIXlt("13:29:56.061", format='%H:%M:%OS', tz='UTC')
> print(as.numeric(x), digits=20)
[1] 1339075796.0610001087
Run Code Online (Sandbox Code Playgroud)
URL似乎也表明这只是一个显示问题,但我注意到使用"%OS3"
没有选项行的语句似乎没有拾取正确的位数.
我在Windows下使用的版本是32位2.15.0,但这似乎存在于R的其他情况下.
请注意,我的原始数据是CSV文件中的这些日期时间字符串我必须找到一种方法,将它们从字符串转换为正确的毫秒时间.
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"那里得到.
我在文件中有一个字符日期时间列.我加载文件(进入a data.table
)并执行需要将列转换为的内容POSIXct
.然后我需要将POSIXct
值写回文件,但日期时间将不相同(因为它打印不正确).
这种打印/格式化问题是众所周知的,并且已经多次讨论过.我读过一些描述这个问题的帖子.我发现的最权威的答案是针对这个问题给出的.该问题的答案提供了两个应该解决此问题的函数(myformat.POSIXct
和form
),但它们似乎不适用于此示例:
x <- "04-Jan-2013 17:22:08.139"
options("digits.secs"=6)
form(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),format="%d-%b-%Y %H:%M:%OS3")
[1] "04-Jan-2013 17:22:08.138"
form(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),format="%d-%b-%Y %H:%M:%OS4")
[1] "04-Jan-2013 17:22:08.1390"
myformat.POSIXct(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),digits=3)
[1] "2013-01-04 17:22:08.138"
myformat.POSIXct(as.POSIXct(x,format="%d-%b-%Y %H:%M:%OS"),digits=4)
[1] "2013-01-04 17:22:08.1390"
Run Code Online (Sandbox Code Playgroud)
我的sessionInfo
:
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)
locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=C
attached base packages:
[1] stats graphics grDevices datasets utils methods base
other attached packages:
[1] fasttime_1.0-0 data.table_1.8.9 …
Run Code Online (Sandbox Code Playgroud) 如何转换字符串
t <- c("00:00:0.00", "00:00:0.34")
Run Code Online (Sandbox Code Playgroud)
变成一个数字?尝试了几种方法 - 但没有一种方法有效..
我的时间戳管理存在问题.在我的数据集中,我有两个变量,即时间和相对时间.时间是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的评论!
考虑这个 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) 我正在试验R来分析一些测量数据.我有一个.csv文件,包含超过200万行测量.这是一个例子:
2014-10-22 21:07:03+00:00,7432442.0
2014-10-22 21:07:21+00:00,7432443.0
2014-10-22 21:07:39+00:00,7432444.0
2014-10-22 21:07:57+00:00,7432445.0
2014-10-22 21:08:15+00:00,7432446.0
2014-10-22 21:08:33+00:00,7432447.0
2014-10-22 21:08:52+00:00,7432448.0
2014-10-22 21:09:10+00:00,7432449.0
2014-10-22 21:09:28+00:00,7432450.0
Run Code Online (Sandbox Code Playgroud)
在读入文件后,我想将时间转换为正确的时间,使用as.POSIXct()
.对于小文件,这可以正常工作,但对于大文件则不行.
我通过读取一个大文件,创建一个小部分的副本然后释放as.POSIXct()
正确的列来做一个例子.我包含了该文件的图像.正如您所看到的,当将它应用于temp
-variable时,它会纠正小时,分钟和秒.但是,将其应用于整个文件时,仅存储日期.(也需要很多时间(超过2分钟))
什么可能导致这种异常?这是由于某些系统限制,因为我在我的笔记本电脑上运行它.
编辑
在我的Windows 7设备上运行R 3.1.3会导致此错误.但是,在运行R 3.0.2的Ubuntu 14.01上,保留了大文件的时间.刚刚注意到有一个适用于Windows的更新版本(3.2.0),将更新并检查问题是否仍然存在.
我想得到亚秒,所以我使用以下内容:
> options(digits.secs=6)
> as.POSIXlt(df1$Global.Time[5]/1000, origin="1970-01-01", tz="America/Los_Angeles")
[1] "2005-06-15 07:53:42.7 PDT"
Run Code Online (Sandbox Code Playgroud)
为什么输出不包含"07:53:42.700000"之类的内容?
同样的问题POSIXct
:
> as.POSIXct(df1$Global.Time[3]/1000, origin="1970-01-01", tz="America/Los_Angeles")
[1] "2005-06-15 07:53:42.5 PDT"
Run Code Online (Sandbox Code Playgroud) 供应商要求我将 SQL ServerDateTime
值转换为以下特定时间戳格式%Y-%m-%d %H:%M:%OS4 %z
。该查询将被放入他们的软件中以查询我的数据库。
所需的输出似乎可能与R 中的posixct 问题模糊相关;但这是关于 SQL Server 中的输出。除了该字段在他们的软件中显示为空白之外,我没有收到任何具体错误,但它在我的 SQL 界面中有效。
我从 SQL 得到的输出如下:
2016-03-16 00:00:00.000
Run Code Online (Sandbox Code Playgroud)
像这样的另一列的输出没有问题varchar(30)
,2016-03-16 11:34:36
因为它只是在映射到字符串字段时将其视为字符串......但要使其处理它需要采用引用的%Y-%m-%d %H:%M:%OS4 %z
格式。
除了数据类型之外,这些差异似乎很微妙,但即使映射到字符串字段,它也无法将 SQL 本机输出映射到其字段中。
我已经尝试过例如
cast(convert(datetime, tn.last_settled, 126) as Varchar(30))
Run Code Online (Sandbox Code Playgroud)
但datetime
结果Jan 1 1990 12:00AM
不是所需的格式。
如何将所需的字符串2016-03-16 11:34:36
和日期时间格式从 T-SQL 中的 SQL Server格式2016-03-16 00:00:00.000
转换为所需的格式?%Y-%m-%d %H:%M:%OS4 %z
datetime
如何将其更改为数值,该数字指的是1.5km运行的记录,包含min:sec:十分之一秒
"4:04.86" -> 4:04.86
Run Code Online (Sandbox Code Playgroud)
as.numeric函数在这种情况下不工作,我认为,因为':'