R 如何在不进行字符串操作的情况下将YYYYMX(tm)格式的字符转换为日期?

R 如何在不进行字符串操作的情况下将YYYYMX(tm)格式的字符转换为日期?,r,date,R,Date,我有一个月度数据文件,其中日期以Stata的%tm格式存储,如2000m1。如何将其转换为日期 我可以将字符串操作成2000-01-01,但如果可能的话,我希望避免这样做 as.Date('2000m1')(毫不奇怪)返回NA使用神奇的lubridate软件包可以非常轻松地完成此操作: data <- c("2001m1","2010m3","2015m12","2009m8") library(lubridate) parse_date_time(data,orders="%Y%m")

我有一个月度数据文件,其中日期以Stata的
%tm
格式存储,如
2000m1
。如何将其转换为日期

我可以将字符串操作成
2000-01-01
,但如果可能的话,我希望避免这样做


as.Date('2000m1')
(毫不奇怪)返回
NA

使用神奇的
lubridate
软件包可以非常轻松地完成此操作:

data <- c("2001m1","2010m3","2015m12","2009m8")

library(lubridate)
parse_date_time(data,orders="%Y%m"):

[1] "2001-01-01 UTC" "2010-03-01 UTC" "2015-12-01 UTC" "2009-08-01 UTC"

data这可以通过神奇的
lubridate
软件包轻松完成:

data <- c("2001m1","2010m3","2015m12","2009m8")

library(lubridate)
parse_date_time(data,orders="%Y%m"):

[1] "2001-01-01 UTC" "2010-03-01 UTC" "2015-12-01 UTC" "2009-08-01 UTC"
data1)yearmon使用zoo包,将其转换为
的“yearmon”
类对象,这可能比将其转换为
的“日期”
更有意义,因为您没有一个月中的哪一天。这些对象在内部表示为1月的年+0,2月的年+1/12,等等,因此它们可以正确排序

library(zoo)

as.yearmon('2000m1', '%Ym%m')
## [1] "Jan 2000"
如果你真的想要
“Date”
课程,那么下面分别给出月初和月底:

as.Date(as.yearmon('2000m1', '%Ym%m'))
## [1] "2000-01-01"

as.Date(as.yearmon('2000m1', '%Ym%m'), frac = 1)
[1] "2000-01-31"
2)粘贴这不使用任何包,虽然它使用了
粘贴
,但它对字符串操作的使用非常少:

as.Date(paste("2000m1", 1), "%Ym%m %d")
## [1] "2000-01-01"
注意:请确保不要使用任何返回POSIXct对象而不是
“yearmon”
“Date”
对象的解决方案,因为此后,您在代码中引入了基于时区的未来潜在错误的可能性,使用适当的类可以完全避免这些错误。请参阅中的R Help Desk文章。

<1)yearmon使用zoo软件包,这会将其转换为
“yearmon”
类对象,这可能比将其转换为
“Date”
更有意义,因为您没有一个月中的哪一天。这些对象在内部表示为1月的年+0,2月的年+1/12,等等,因此它们可以正确排序

library(zoo)

as.yearmon('2000m1', '%Ym%m')
## [1] "Jan 2000"
如果你真的想要
“Date”
课程,那么下面分别给出月初和月底:

as.Date(as.yearmon('2000m1', '%Ym%m'))
## [1] "2000-01-01"

as.Date(as.yearmon('2000m1', '%Ym%m'), frac = 1)
[1] "2000-01-31"
2)粘贴这不使用任何包,虽然它使用了
粘贴
,但它对字符串操作的使用非常少:

as.Date(paste("2000m1", 1), "%Ym%m %d")
## [1] "2000-01-01"

注意:请确保不要使用任何返回POSIXct对象而不是
“yearmon”
“Date”
对象的解决方案,因为此后,您在代码中引入了基于时区的未来潜在错误的可能性,使用适当的类可以完全避免这些错误。请参阅中的R Help Desk文章。

您可以从
lubridate
软件包中查看
parsedatetime
。谢谢--实际上,它是
parse\u date\u time()
是的,您是对的。我将添加它作为答案。您可以从
lubridate
软件包中查看
parsedatetime
。谢谢--实际上,它是
parse\u date\u time()
是的,您是对的。我将添加它作为一个答案。
ggplot
Date
对象更有效,这就是为什么我更喜欢在末尾获得
Date
而不是
yearmon
zoo
具有
缩放x\u yearmon()
ggplot2
交互
ggplot
Date
对象的交互效果更好,这就是为什么我更喜欢在末尾获取
Date
而不是
yearmon
的原因。
zoo
拥有
scale_x_yearmon()
ggplot2
交互