R语言问题:lubridate日期存入数据框变为数值而非日期格式
解决DataFrame中日期被存储为数值的问题
你的问题根源在于:初始创建的df1中,Start_date列是逻辑型(当列全为NA时,R的data.frame默认会将其设为logical类型)。当你向逻辑型列赋值Date类型对象时,R会自动将日期转换为对应的数值——这是因为Date类型在R底层本质是自1970-01-01起的天数,逻辑型列无法存储Date对象,只能强制转成数值。
以下是几种解决方法:
方法一:初始化时指定Date类型列
创建DataFrame时,直接将Start_date列初始化为Date类型的NA,避免后续类型强制转换:
library(lubridate) df1 = data.frame( task = c('do somthing', 'do something else', 'do something more'), Start_date = as.Date(rep(NA, 3)) # 明确指定列类型为Date ) Start_date = ymd("2023-12-01") df1$Start_date[1] = Start_date Start_date # 返回"2023-12-01" df1$Start_date[1] # 返回"2023-12-01",类型为Date
方法二:赋值后转换列类型
如果已经创建了DataFrame,可以事后将数值型的列转换回Date类型:
library(lubridate) df1 = data.frame( task = c('do somthing', 'do something else', 'do something more'), Start_date = c(NA, NA, NA) ) Start_date = ymd("2023-12-01") df1$Start_date[1] = Start_date # 将数值转换为Date类型,指定原点为1970-01-01 df1$Start_date = as.Date(df1$Start_date, origin = "1970-01-01") df1$Start_date[1] # 返回"2023-12-01"
方法三:使用replace函数赋值并修正类型
用replace函数赋值后,再确保列类型为Date:
library(lubridate) df1 = data.frame( task = c('do somthing', 'do something else', 'do something more'), Start_date = c(NA, NA, NA) ) Start_date = ymd("2023-12-01") df1$Start_date = replace(df1$Start_date, 1, Start_date) # 强制转换为Date类型 df1$Start_date = as.Date(df1$Start_date) df1$Start_date[1] # 返回"2023-12-01"
内容的提问来源于stack exchange,提问作者Paul Shearer
相关产品推荐
相关产品推荐

