将字符串转换为R中的日期

Pat*_*vec 4 r date

我尝试转换的数据应该是日期,但它的格式为 mmddyyyy,没有用破折号或斜线分隔。为了在 R 中处理日期,我希望将其格式化为 mm-dd-yyyy 或 mm/dd/yyyy。

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

Ren*_*rop 6

看一下lubridate mdy功能

require(lubridate)
a <- "10281994"
mdy(a)
Run Code Online (Sandbox Code Playgroud)

给你

[1] "1994-10-28 UTC"
Run Code Online (Sandbox Code Playgroud)

类的"POSIXct" "POSIXt"日期时间在 R 中(感谢 Joshua Ulrich 的更正)

您可以使用as.Date(mdy(a))=1994-10-28来获取 class 的 Object Date

也存在类似ymddmy内部的突变lubridate

  • “Date”类对象是 R 中的日期。“POSIXct”对象是日期时间,而不是日期。 (2认同)

cla*_*123 6

更新:改进了与@Richard斯克里芬colClasses和简单的as.Date()建议

这里有两种对我有用的类似方法,从包含mmddyyyy格式日期的 csv到让它被 R 识别为日期对象。

首先从一个简单的文件 tv.csv 开始:

Series,FirstAir
Quantico,09272015
Muppets,09222015
Run Code Online (Sandbox Code Playgroud)

方法一:全部为字符串

一旦在 R 中,

> t = read.csv('tv.csv', colClasses = 'character')
Run Code Online (Sandbox Code Playgroud)
  • 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"
Run Code Online (Sandbox Code Playgroud)
  • R 已将所有内容作为字符串导入,此处表示为类型 chr

chr然后很容易将或 字符串转换为日期:

> t$FirstAir = as.Date(t$FirstAir, "%m%d%Y")
Run Code Online (Sandbox Code Playgroud)
  • as.Date() 执行字符串到日期的转换
  • %m%d%Y指定如何解释 中的输入t$FirstAir。这些格式代码,至少在 Linux 上,可以通过运行找到,$ man date它会调出date程序手册,其中有一个格式代码列表。例如它说%m month (01..12)

方法 2:导入然后只修复日期

如果出于某种原因,您不希望对所有字符进行全面导入转换,例如具有许多变量的文件,并希望保留 R 的自动类型识别功能,但仅“修复”一个日期变量,请遵循此方法。

一旦在 R 中,

> t = read.csv('tv.csv')
Run Code Online (Sandbox Code Playgroud)
  • 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
>
Run Code Online (Sandbox Code Playgroud)
  • R 尽量猜测每个变量的变量类型
  • 正如您所看到的,一个直接的问题是,因为FirstAir变量 R 已09272015作为int整数导入,并去掉了前导零填充,09 中的 0 稍后对于日期转换很重要,但 R 没有导入它。所以我们需要解决这个问题。

这可以在单个命令中完成,但为了清楚起见,我将其分为两个步骤。第一的,

> t$FirstAir = sprintf("%08d", t$FirstAir)
Run Code Online (Sandbox Code Playgroud)
  • sprintf 是格式化函数
  • 0 表示用零填充
  • 8 表示确保 8 个字符,因为 mmddyyyy 总共 8 个字符
  • d当输入是一个数字时使用,目前它是,回忆str()输出声称这t$FirstAir是一个int意义整数
  • t$FirstAir 是我们设置并用作输入的变量

检查结果:

> str(t$FirstAir)
 chr [1:2] "09272015" "09222015"
Run Code Online (Sandbox Code Playgroud)
  • 它成功地从 an 转换int为一个chr类型,例如9272015变成了"09272015"

现在它是chr我们可以转换的字符串或类型,与方法 1 相同。

> t$FirstAir = as.Date(strptime(t$FirstAir, "%m%d%Y"))
Run Code Online (Sandbox Code Playgroud)

结果

我们做最后的检查:

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

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