R语言拼接日期时间列遇NA问题及排序方法咨询
解决方法及疑问解答
一、为什么生成的datetime列是NA?
你的代码里paste()拼接出来的字符串是空格分隔的(比如"2013 1 7 21 54"),但as.POSIXct()的format参数写的是"%Y/%m/%d %H:%M:%S",格式完全不匹配,导致解析失败返回NA。
二、正确生成datetime列的方法
方法1:调整分隔符匹配格式(基础R)
# 拼接时用对应分隔符,不需要秒数就去掉格式里的:%S df$datetime <- as.POSIXct( paste(paste(df$year, df$month, df$day, sep = "/"), paste(df$hour, df$minute, sep = ":")), format = "%Y/%m/%d %H:%M" )
方法2:用lubridate包简化操作(推荐)
lubridate专门处理日期时间,代码更直观:
library(lubridate) library(dplyr) # 先生成标准POSIXct类型的时间列 df <- df %>% mutate(datetime = make_datetime(year, month, day, hour, minute)) # 如果需要显示成你要的格式(仅改变显示,底层仍是时间类型) df$datetime <- format(df$datetime, "%Y/%m/%d %H:%M")
方法3:strptime直接解析
# strptime生成POSIXlt类型,可转成POSIXct方便后续运算 df$datetime <- strptime( paste(df$year, df$month, df$day, df$hour, df$minute), format = "%Y %m %d %H %M" ) df$datetime <- as.POSIXct(df$datetime)
三、你的两个疑问解答
1. 用as.Date()合并年月日之后,如何添加时间?
as.Date()仅生成日期类型(只有年月日),要添加时间需转成POSIXct/POSIXlt类型,示例如下:
# 先生成日期列 df$date_col <- as.Date(paste(df$year, df$month, df$day, sep = "-")) # 拼接日期和时间后转成带时间的格式 df$datetime <- as.POSIXct( paste(df$date_col, paste(df$hour, df$minute, sep = ":")), format = "%Y-%m-%d %H:%M" )
2. 如何按datetime列排序?
两种常用写法:
dplyr写法(简洁易读)
# 正序排序 df_sorted <- df %>% arrange(datetime) # 倒序排序 df_sorted_desc <- df %>% arrange(desc(datetime))
基础R写法
# 正序 df_sorted <- df[order(df$datetime), ] # 倒序 df_sorted_desc <- df[order(-df$datetime), ]
内容的提问来源于stack exchange,提问作者Bluetail
相关产品推荐
相关产品推荐

