我需要转换的数据应该是一个日期,但格式为mmddyyyy,没有用破折号或斜杠分隔。为了在R中使用日期,我希望将其格式化为mm-dd-yyyy或mm/dd/yyyy。
我认为我可能需要使用grep()
,但我不确定如何使用它来重新格式化所有以mmddyyyy格式表示的日期。
更新:借鉴@Richard Scriven的colClasses
和更简单的as.Date()
建议进行改进。
以下是两种我用过的相似方法,从包含mmddyyyy
格式日期的csv文件中获取其被R识别为日期对象。
首先从一个简单的文件tv.csv开始:
Series,FirstAir
Quantico,09272015
Muppets,09222015
进入R后,
> t = read.csv('tv.csv', colClasses = 'character')
tv.csv
作为数据框导入,命名为t
colClasses = 'character')
选项使所有数据都被视为character
数据类型(而不是Factor
、int
类型)检查其初始结构:
> str(t)
'data.frame': 2 obs. of 2 variables:
$ Series : chr "Quantico" "Muppets"
$ FirstAir: chr "09272015" "09222015"
chr
类型chr
或字符串随后可以轻松转换为日期:
> t$FirstAir = as.Date(t$FirstAir, "%m%d%Y")
as.Date()
函数执行字符串到日期的转换。%m%d%Y
指定如何解释t$FirstAir
中的输入。这些格式代码(至少在Linux上)可以通过运行$ man date
来查找,该命令会打开date
程序的手册,在那里有一个格式代码列表。例如,它说%m 月份 (01..12)
如果由于某种原因您不想对所有字符进行全局导入转换,例如一个包含多个变量的文件,并希望保留R的自动类型识别但仅“修复”一个日期变量,则可以按照以下方法操作。
进入R后,
> t = read.csv('tv.csv')
tv.csv
导入为数据框,并命名为 t
查看其初始结构:
> str(t)
'data.frame': 2 obs. of 2 variables:
$ Series : Factor w/ 2 levels "Muppets","Quantico": 2 1
$ FirstAir: int 9272015 9222015
>
FirstAir
,R已将 09272015
导入为 int
,表示整数,并删除了前导零填充,而09中的0稍后用于日期转换而R却没有导入它。因此,我们需要修复这个问题。这可以通过一条命令完成,但为了清晰起见,我将其分成两个步骤。首先,
> t$FirstAir = sprintf("%08d", t$FirstAir)
sprintf
是一个格式化函数0
表示用零进行填充8
表示确保有8个字符,因为mmddyyyy总共有8个字符d
用于当输入是数字时,当前它就是数字,回顾str()
输出声称t$FirstAir
是一个int
,意味着整数t$FirstAir
是我们正在设置并用作输入的变量检查结果:
> str(t$FirstAir)
chr [1:2] "09272015" "09222015"
int
类型转换成了chr
类型,例如9272015
变成了"09272015"
现在它是一个字符串或者chr
类型,我们可以像方法1一样进行转换。
> t$FirstAir = as.Date(strptime(t$FirstAir, "%m%d%Y"))
We do a final check:
> str(t$FirstAir)
Date[1:2], format: "2015-09-27" "2015-09-22"
t <- read.csv("tv.csv", colClasses = "character")
。这将所有列设置为字符,因此您不会丢失前导零。然后使用t$FirstAir <- as.Date(t$FirstAir, "%m%d%Y")
来设置日期。 - Rich Scriven请看lubridate
包中的mdy
函数
require(lubridate)
a <- "10281994"
mdy(a)
为您提供
[1] "1994-10-28 UTC"
该文本中的"POSIXct" "POSIXt"代表R中的日期时间类型。(感谢Joshua Ulrich指正)
你可以使用as.Date(mdy(a))
= 1994-10-28
将其转换为日期类型。
lubridate
包中还有诸如ymd
和dmy
等变异形式。
Date
类的对象在R中表示日期。 POSIXct
对象是日期时间,不是日期。 - Joshua Ulrich
as.Date("12252015", format="%m%d%Y")
- Soheil