Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-时间变量和日期的条件操作_R_Datetime_Dataframe_Dplyr - Fatal编程技术网

R-时间变量和日期的条件操作

R-时间变量和日期的条件操作,r,datetime,dataframe,dplyr,R,Datetime,Dataframe,Dplyr,假设,我有下面的数据框,希望对最后一个变量HMS执行一些操作。 目的是创建一个新变量,比如说TimeStampNew,如果观察时间在当天的17:30:00之后,则指定第二天。当观察结果显示无值('NA')时,则应使用相同日期的时间戳 问题是,要将HMS-变量从类字符转换为允许条件的格式。我已经检查了chron包,或者将其转换为类型为POSIXct的对象作为可能的替代 我在这篇文章中已经问了一个类似的问题:。 我已经试着用dplyr包的一些操作来解决这个问题,正如上面提到的帖子所建议的那样。然而,

假设,我有下面的数据框,希望对最后一个变量
HMS
执行一些操作。 目的是创建一个新变量,比如说
TimeStampNew
,如果观察时间在当天的
17:30:00
之后,则指定第二天。当观察结果显示无值(
'NA'
)时,则应使用相同日期的
时间戳

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

我在这篇文章中已经问了一个类似的问题:。 我已经试着用
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

使用
difftime
ifelse
语句:

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使用
difftime
ifelse
语句:

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假设
DF
如末尾注释所示。特别是
时间戳
HMS
都假定为字符列<代码>时间戳
也可以是
“日期”
类列

如果
HMS
超过17:30,则以下代码将
HMS
列中的
NA
值替换为
00:00“
,并将
时间戳添加1天(将其转换为
日期”
类)

transform(DF, Date = 
  as.Date(TimeStamp) + (replace(HMS, is.na(HMS), "00:00:00") > "17:30:00"))
在新的
Date
列属于
“Date”
类的情况下给出此数据框


假设
DF
,如末尾注释所示。特别是
时间戳
HMS
都假定为字符列<代码>时间戳
也可以是
“日期”
类列

如果
HMS
超过17:30,则以下代码将
HMS
列中的
NA
值替换为
00:00“
,并将
时间戳添加1天(将其转换为
日期”
类)

transform(DF, Date = 
  as.Date(TimeStamp) + (replace(HMS, is.na(HMS), "00:00:00") > "17:30:00"))
在新的
Date
列属于
“Date”
类的情况下给出此数据框


类似于时间戳+(!is.na(HMS)&HMS>“17:30:00”)
?您的示例不容易复制,因此我不测试代码。类似于
TimeStamp+(!is.na(HMS)&HMS>“17:30:00”)
?你的例子不容易复制,所以我不测试代码。谢谢!很好用!语法的最后一行我改为df1$TimeStampNew[is.na(df1$TimeStampNew)]谢谢!很好用!语法中的最后一行我改为df1$TimeStampNew[is.na(df1$TimeStampNew)]
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)