【问题标题】:Unexpected dropping of end of string with gsub()使用 gsub() 意外删除字符串结尾
【发布时间】:2021-06-17 15:57:36
【问题描述】:

我对以下行为感到困惑。

> tmpString <- Sys.time()
> tmpString
[1] "2021-06-17 11:50:52 EDT"
> gsub(" ",  "_", tmpString)
[1] "2021-06-17_11:50:52"
> gsub(" ",  "_", tmpString, fixed=TRUE)
[1] "2021-06-17_11:50:52"

为什么 tmpString 末尾的“EDT”会丢失?

为了完整性,

> R.version
               _                           
platform       x86_64-pc-linux-gnu         
arch           x86_64                      
os             linux-gnu                   
system         x86_64, linux-gnu           
status                                     
major          3                           
minor          6.3                         
year           2020                        
month          02                          
day            29                          
svn rev        77875                       
language       R                           
version.string R version 3.6.3 (2020-02-29)
nickname       Holding the Windsock        
> 

【问题讨论】:

  • 时区添加在打印方法中。它实际上并未存储在您的数据中。
  • 正如@Dason所说,时区是对象类的一部分。 Sys.time() 是 POSIXct / POSIXt 但是当您使用 gsub 时,对象会转换为字符并丢失其他信息。如果你想保留对象类,你应该检查 format() 函数......你总是可以通过使用 class() 调用来检查对象/变量的类
  • 啊……我明白了。谢谢。
  • 格式调用的一个选项是:format(Sys.time(), "%Y-%m-%d_%H:%M:%S %Z") ...显示缩写的一种方法是直接在格式调用中通知它,但这可能不适合您的情况: format(Sys.time(), "%Y-%m-%d_%H:%M:%S %Z ", tz = "GMT") ...如果它不能解决您的问题,恐怕您必须阅读有关时区缩写的主题并可能使用 lubridate 包。

标签: r gsub


【解决方案1】:

tmpString 不是字符串。正如在 cmets 中提到的,它是一个 POSIXct 对象,它在内部是自 UNIX 纪元以来的秒数,它是 print 函数,它用时区显示它。最好将其称为tmp 而不是tmpString,然后显式使用format 将其转换为字符串。 (下面我们使用sub 替换第一个空格,但如果您想替换两个空格,请使用问题中的gsub。)

tmp <- Sys.time()
sub(" ", "_", format(tmp, usetz = TRUE))
## [1] "2021-06-17_12:39:51 EDT"

还要注意format_ISO8601 的存在,您可能更喜欢:

format_ISO8601(tmp, usetz = TRUE)
## [1] "2021-06-17T12:39:51-0400"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 2012-07-31
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多