首页 > 解决方案 > 将 ifelse 与日期时间数据一起使用时,如何停止隐式日期转换?

问题描述

我有一个数据框,其中包含一个列,该列是一系列日期,通过 Google 表单收集。日期和时间分别收集。数据是通过从日历中选择一天来输入的,并且日期是手动输入的——应该是 24 小时制,但该字段似乎刚刚检查了小时和分钟是否在正确的范围内。

我已经从.csv. 我通过使用将日期时间字符字段(从 中读取.csv)转换为新变量中的日期时间格式as.POSIXct(foo$When, tz="NZ", format="%Y-%m-%d %H:%M")。日期和时间构造正确。

除了:我在原始数据中有一些不正确的日期/时间条目。正如您所期望的那样,这些都已NA在新领域中设置。对于确实包含时间的那些,我一直在尝试修复它们,同时仍保留POSIXct格式。

我一直不成功。

这是我拥有的数据示例以及我尝试做的事情:

TestDataForHelp <- data.frame(OldDateTime = 
   c("2013-12-04 21:10", "2013-12-15 09:07", "2014-01-01 06:27",
     "2014-11-02 21:15", "2014-11-07 23:00", "2015-01-04 21:42",
     "201508-11-02 20:15", "201508-11-02 20:15", "2017-11-02"))
TestDataForHelp$ActualDateTime <- 
   as.POSIXct(TestDataForHelp$OldDateTime, tz="NZ", format="%Y-%m-%d %H:%M")

TestDataForHelp$FixedDateTime <- 
  ifelse(TestDataForHelp$OldDateTime=="201508-11-02 20:15", 
         as.POSIXct("2015-11-02 20:15", tz="NZ", format="%Y-%m-%d %H:%M"),
         TestDataForHelp$ActualDateTime)

新变量FixedDateTime没有POSIXct type。它已被隐式转换为numeric类型。如何保留POSIXct格式ActualDateTime而不进行隐式类型转换?

我不想拥有FixedDateTime,而是将更正后的数据放入ActualDateTime. ifelse()似乎是导致格式从转换POSIXctnumeric. 如果我做:

 TestDataForHelp$CopiedDateTime <- TestDataForHelp$ActualDateTime

新变量只是原始变量的副本,它保留了POSIXct类型。

评论中链接的上一个问题仅与日期值有关,与日期时间值无关。鉴于我的也不包括秒,数据操作在处理日期时间值时变得更加复杂。另一个区别是原始变量包含日期、日期时间和不正确的日期时间值的混合,而之前的问题具有相同的值。目前尚不清楚变量的不统一内容是否导致了问题。

编辑:我通过在将字符串转换为日期之前修复字符串来解决问题。这消除了尝试循环访问日期的需要。

标签: rdatetimeformatnumeric-conversion

解决方案


我可以复制数字答案,但不能解释它。但是,它会为您正确计算结果。我不确定为什么它以数字形式返回。但是,如果您知道原点(应该是 1970-01-01),那么从数字到日期的转换就很容易了。所以我相信以下方法可以解决问题:

(注意,第一个块就是你已经拥有的)

TestDataForHelp$FixedDateTime <- ifelse(TestDataForHelp$OldDateTime=="201508-11-02 20:15", 
                                as.POSIXct("2015-11-02 20:15", tz="NZ", format="%Y-%m-%d %H:%M"),
                                TestDataForHelp$ActualDateTime)

TestDataForHelp$FixedDateTime <- as.POSIXct(TestDataForHelp$FixedDateTime, 
                                            origin = as.POSIXct("1970-01-01", tz="NZ"))

推荐阅读