R 仅替换PosixCt类中的日期

R 仅替换PosixCt类中的日期,r,replace,posix,posixct,R,Replace,Posix,Posixct,我有一个PosixCt格式的大型日期数据框。我的目标很简单:将所有日期更改为一天(2016-05-01),同时保持所有时间不变。如果我将sample$newtime转换为字符,我将如何替换字符串(每行)中的前10个字符 > class(sample$newtime) [1] "POSIXct" "POSIXt" > head(sample) newtime 1 2016-05-01 02:25:34 2 2016-05-01 02:2

我有一个PosixCt格式的大型日期数据框。我的目标很简单:将所有日期更改为一天(2016-05-01),同时保持所有时间不变。如果我将
sample$newtime
转换为字符,我将如何替换字符串(每行)中的前10个字符

> class(sample$newtime)
[1] "POSIXct" "POSIXt" 

> head(sample)
                      newtime

1 2016-05-01 02:25:34
2 2016-05-01 02:20:23
3 2016-05-01 02:13:58
4 2016-05-01 02:10:33
5 2016-05-01 02:07:36
6 2016-05-01 02:03:01
> dim(sample)

    [1] 92020     1
> range(sample$newtime)
[1] "2015-01-01 01:04:29 MSK" "2016-06-15 12:45:03 MSK"

您可以使用
lubridate
软件包中的
date
功能,例如:

library(lubridate)
x = Sys.time()
y = Sys.time()

x
# [1] "2016-07-11 09:16:40 EDT"
y
# [1] "2016-07-11 09:16:45 EDT"

vec <- c(x, y)
date(vec)
# [1] "2016-07-11" "2016-07-11"
date(vec) <- "2015-01-01"           # change the date here
vec
# [1] "2015-01-01 09:16:40 EST" "2015-01-01 09:16:45 EST"
库(lubridate)
x=系统时间()
y=系统时间()
x
#[1]“2016-07-11 09:16:40美国东部时间”
Y
#[1]“2016-07-11 09:16:45美国东部时间”

vec以下是一些替代方案。每一项都将日期部分更改为2016-06-01。没有使用任何软件包

1)sub将前导的非空格替换为日期,并转换回POSIXct。请注意,
sub
会自动将
p
转换为字符,因此我们不需要显式地这样做。未使用任何软件包:

as.POSIXct(sub("\\S+", "2016-06-01", p))
1a)这是一个类似的选择。替换将其转换回POSIXct:

replace(p, TRUE, sub("\\S+", "2016-06-01", p))
2)算术另一种可能性是减去日期,然后加上新的日期。如果不使用
格式
,可能会出现时区问题,如图所示:

p - as.POSIXct(as.Date(format(p))) + as.POSIXct("2016-06-01")
3)POSIXlt列表这将转换为POSIXlt列表,重置年份、周一和周日组件,并在最后一行中转换回

toList <- function(x) unclass(as.POSIXlt(x))
m <- modifyList(toList(p), toList("2016-06-01")[c("year", "mon", "mday")])
as.POSIXct(structure(m, class = "POSIXlt"))

可以在管道符号中使用吗<例如,代码>变异
with(unclass(as.POSIXlt("2016-06-01")), {
    p.lt <- as.POSIXlt(p)
    p.lt$year <- year
    p.lt$mon <- mon
    p.lt$mday <- mday
    as.POSIXct(p.lt)
})
p <- structure(c(1462083934, 1462083623, 1462083238, 1462083033, 1462082856, 
    1462082581), class = c("POSIXct", "POSIXt"), tzone = "")