在R中将字符转换为日期

9

我需要转换的数据应该是一个日期,但格式为mmddyyyy,没有用破折号或斜杠分隔。为了在R中使用日期,我希望将其格式化为mm-dd-yyyy或mm/dd/yyyy。

我认为我可能需要使用grep(),但我不确定如何使用它来重新格式化所有以mmddyyyy格式表示的日期。


3
as.Date("12252015", format="%m%d%Y") - Soheil
2个回答

9

更新:借鉴@Richard ScrivencolClasses和更简单的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数据类型(而不是Factorint类型)

检查其初始结构:

> str(t)
'data.frame':   2 obs. of  2 variables:
 $ Series  : chr  "Quantico" "Muppets"
 $ FirstAir: chr  "09272015" "09222015"
  • R已将所有内容作为字符导入,这里表示为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
>
  • R会尽其所能猜测每个变量的类型
  • 您可以看到一个直接的问题是,对于变量 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"))

Result

We do a final check:

> str(t$FirstAir)
 Date[1:2], format: "2015-09-27" "2015-09-22"

在这两种情况下,文本文件中的原始值已成功转换为 R 日期对象。

你也可以使用t <- read.csv("tv.csv", colClasses = "character")。这将所有列设置为字符,因此您不会丢失前导零。然后使用t$FirstAir <- as.Date(t$FirstAir, "%m%d%Y")来设置日期。 - Rich Scriven

6

请看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包中还有诸如ymddmy等变异形式。


2
Date类的对象在R中表示日期。 POSIXct对象是日期时间,不是日期。 - Joshua Ulrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接