【问题标题】:R - Conditional operations on time variables and datesR - 时间变量和日期的条件操作
【发布时间】:2018-09-30 04:48:48
【问题描述】:

假设,我有下面的数据框,想对最后一个变量HMS 做一些操作。 目的是创建一个新变量,比如说TimeStampNew,如果观察在当天的17:30:00 之后,则分配第二天。当观察表明没有值时('NA'),则应使用同一日期的TimeStamp

问题是,将HMS-变量从类字符转换为允许条件的格式。我已经检查了 chron-package 或将其转换为 POSIXct 类型的对象作为可能的替代方案。

我在这篇文章中已经问过一个类似的问题:R - Condition on character variable "weekday" and replace with special "date" in a data frame。 我已经尝试通过上面提到的帖子中建议的dplyr 包的一些操作来解决这个问题。但是,由于时间格式复杂,我没有收到想要的解决方案。

有人对这个问题提出解决方案吗?!

提前致谢!

    TimeStamp      HMS
1  2010-02-22 19:55:00
2  2012-10-10 07:53:00
3  2012-10-24 07:55:00
4  2013-07-15 08:14:00
5  2013-07-24 08:23:00
6  2013-12-02 10:00:00
7  2012-02-23 07:56:00
8  2012-03-06 08:45:00
9  2013-09-15 19:54:00
10 2007-03-28 NA      
11 2007-08-09 NA      
12 2008-08-07 NA

【问题讨论】:

  • 类似TimeStamp + (!is.na(HMS) & HMS > "17:30:00")?您的示例不容易重现,因此我没有测试代码。

标签: r datetime dataframe dplyr


【解决方案1】:

使用difftimeifelse 语句:

df1$TimeStamp <- as.Date(df1$TimeStamp, format = "%Y-%m-%d")

df1$TimeStampNew <- ifelse(
  difftime(as.POSIXct(df1$HMS, format = "%H:%M:%S"), 
  as.POSIXct("17:30:00", format = "%H:%M:%S")) > 0,
  as.character(df1$TimeStamp + 1), 
  as.character(df1$TimeStamp))

df1$TimeStampNew[is.na(df1$HMS)] <- as.character(df1$TimeStamp[is.na(df1$HMS)])

它产生的数据框:

> df1
    TimeStamp      HMS TimeStampNew
1  2010-02-22 19:55:00   2010-02-23
2  2012-10-10 07:53:00   2012-10-10
3  2012-10-24 07:55:00   2012-10-24
4  2013-07-15 08:14:00   2013-07-15
5  2013-07-24 08:23:00   2013-07-24
6  2013-12-02 10:00:00   2013-12-02
7  2012-02-23 07:56:00   2012-02-23
8  2012-03-06 08:45:00   2012-03-06
9  2013-09-15 19:54:00   2013-09-16
10 2007-03-28     <NA>   2007-03-28
11 2007-08-09     <NA>   2007-08-09
12 2008-08-07     <NA>   2008-08-07

【讨论】:

  • 谢谢!效果很好!语法的最后一行我更改为 df1$TimeStampNew[is.na(df1$TimeStampNew)]
【解决方案2】:

假设DF 如末尾注释中可重复显示的那样。特别是TimestampHMS 都被假定为字符列。 Timestamp 也可以是 "Date" 类列。

下面的代码将HMS 列中的NA 值替换为"00:00:00",并在HMS 超过17:30 时为TimeStamp(将其转换为"Date" 类后)增加1 天。

transform(DF, Date = 
  as.Date(TimeStamp) + (replace(HMS, is.na(HMS), "00:00:00") > "17:30:00"))

给出这个数据框,其中新的Date 列属于"Date" 类。

    TimeStamp      HMS       Date
1  2010-02-22 19:55:00 2010-02-23
2  2012-10-10 07:53:00 2012-10-10
3  2012-10-24 07:55:00 2012-10-24
4  2013-07-15 08:14:00 2013-07-15
5  2013-07-24 08:23:00 2013-07-24
6  2013-12-02 10:00:00 2013-12-02
7  2012-02-23 07:56:00 2012-02-23
8  2012-03-06 08:45:00 2012-03-06
9  2013-09-15 19:54:00 2013-09-16
10 2007-03-28     <NA> 2007-03-28
11 2007-08-09     <NA> 2007-08-09
12 2008-08-07     <NA> 2008-08-07

注意

输入 DF 以可重现的形式:

Lines <- "
    TimeStamp      HMS
1  2010-02-22 19:55:00
2  2012-10-10 07:53:00
3  2012-10-24 07:55:00
4  2013-07-15 08:14:00
5  2013-07-24 08:23:00
6  2013-12-02 10:00:00
7  2012-02-23 07:56:00
8  2012-03-06 08:45:00
9  2013-09-15 19:54:00
10 2007-03-28 NA      
11 2007-08-09 NA      
12 2008-08-07 NA"

DF <- read.table(text = Lines, as.is = TRUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    相关资源
    最近更新 更多