R strptime未传送到数据帧

问题描述

library(dplyr)

names <- c('a','b','c')
dates1 <- c('2020-08-14','2020-08-15','2020-08-16')
dates2 <- c('2019-08-14','2019-08-15','2019-08-16')

df <- data.frame(names,dates1,dates2)
print(colnames(df))

timestamps <- df %>% select(dates1,dates2) %>%
  strptime('%Y-%m-%d')
print(timestamps)

为什么timestamps是一对NA?如何获得将strptime正确应用于这些日期时间字符串的方法

解决方法

您正在将sptrptime应用于数据框,而应将其应用于列

library(dplyr)
df %>% mutate(across(starts_with('date'),strptime,'%Y-%m-%d'))

#  names     dates1     dates2
#1     a 2020-08-14 2019-08-14
#2     b 2020-08-15 2019-08-15
#3     c 2020-08-16 2019-08-16

由于列中只有日期信息,因此可以使用as.Date

df %>% mutate(across(starts_with('date'),as.Date))
,

这是两列的data.frame,如果打算通过用as.POSIXct遍历列来转换为DateTime类,则可以使用across

library(dplyr) # >= 1.00
out <- df %>% 
    select(dates1,dates2)  %>%
    mutate(across(everything(),as.POSIXct))
out
#  dates1     dates2
#1 2020-08-14 2019-08-14
#2 2020-08-15 2019-08-15
#3 2020-08-16 2019-08-16

如果我们使用的是dplyr的早期版本,请使用mutate_atmutate_all

df %>%
    select(dates1,dates2) %>%
     mutate_all(as.POSIXct)

它也可以与strptime一起使用,但是要注意结构和类POSIXlt

out2 <- df %>% 
    select(dates1,format = '%Y-%m-%d'))

unclass(out2$dates1)
#$sec
#[1] 0 0 0

#$min
#[1] 0 0 0

#$hour
#[1] 0 0 0

#$mday
#[1] 14 15 16
#...

关于OP最初关于管道的问题,它在单个列或向量上进行

df %>%
    pull(dates1) %>% 
    strptime(format = '%Y-%m-%d')
#[1] "2020-08-14 CDT" "2020-08-15 CDT" "2020-08-16 CDT"

因为?strptime的文档说输入应该是

x-要转换的对象:strptime的字符向量,可以将其转换为strftime的“ POSIXlt”对象。


如果我们不想select,请使用选择修饰符

df %>%       
    mutate(across(-1,as.POSIXct))
# names     dates1     dates2
#1     a 2020-08-14 2019-08-14
#2     b 2020-08-15 2019-08-15
#3     c 2020-08-16 2019-08-16

或者如果打算转换为Date类,则只需使用as.Date

df %>% 
    select(dates1,dates2)  %>%
     mutate(across(everything(),as.Date))

注意:strptime返回list,不推荐


另外,另一个选择是base R

df[-1] <- lapply(df[-1],format = '%Y-%m-%d')