as.Date来自'YYYY.mm'格式

Zlo*_*Zlo 7 r date as.date

我有一个数据框,其中日期存储为double例如,1993.09 1993.10 1993.11 1993.12

我想将其转换为日期格式'%Y %m %d'(总是天数1).

据我所知,as.Date()想要一个字符串输入.但是,由于某些原因,当我将日期转换为字符串后sapply(dates, as.character),零点会消失,从而有效地将10月转换为1月,从而导致每年有两个Januaries.

dates
1993.07 1993.08 1993.09 1993.10 1993.11 1993.12
sapply(dates, as.character)
sub("[.]", " ", dates)
"1993 07" "1993 08" "1993 09" "1993 1"  "1993 11" "1993 12"
Run Code Online (Sandbox Code Playgroud)

是否有更直接的方式来转换日期?或者我在哪里陷入困境?

dput:

c(1993.01, 1993.02, 1993.03, 1993.04, 1993.05, 1993.06, 1993.07, 
1993.08, 1993.09, 1993.1, 1993.11, 1993.12)
Run Code Online (Sandbox Code Playgroud)

Rol*_*and 9

你的问题是你有一些字符串,但看起来像一个数字,你在导入过程中没有处理这个问题.R不区分1993.11993.10.两者都是相同的数字.因此,as.character(1993.10)回报"1993.1".您需要使用格式化功能来确保在句点之后得到两位数,因为as.Date "1993.1"并且"1993.01"是同一个月.

x <- c(1993.09, 1993.10, 1993.11, 1993.12)
as.Date(sprintf("%.2f.01", x), format = "%Y.%m.%d")
#[1] "1993-09-01" "1993-10-01" "1993-11-01" "1993-12-01"
Run Code Online (Sandbox Code Playgroud)

当然,x应该先作为角色导入.


G. *_*eck 6

如果你真的只想"Date"在本月的第一天将其转换为课堂,那么Roland的解决方案似乎最直接,但还有一些其他的考虑因素,例如你是否想要使用月末或者你是否真的想要代表年份 -几个月使用日期.

zoo包有一个"yearmon"类,它可以直接表示年月而不将它们转换为日期,并且如果你想要类,还可以使用as.Date.yearmonfrac=参数的方法来指定转换为月份的方式的分数"Date".

首先,确保日期是字符串.问题中的输入显示为1993.10作为输入之一,因此我们必须确保有一个尾随零.(如果输入已性格与尾随零,则这是没有问题的.我们这里假设的最坏情况假设的数值,使我们需要明确地将其转换为字符蜇伤后带上0,如果需要的话.)现在使用as.yearmon与格式"%Y.%m".最后用于as.Date.yearmon转换为"Date"类.

也许这种做法的最大好处是,我们可以只留下结果"yearmon"类(即省略了"as.Date"一部分,例如as.yearmon(sprintf("%.2f", dates)),或者如果日期已经字符串,dates.ch与在的情况下,尾随0 "1993.10"然后只是as.yearmon(dates.ch, "%Y.%m"),这究竟代表什么你因为在开始时不存在这一天并没有真正意义,因此可以更好地"yearmon"对象. 可以以预期的方式绘制和排序对象.

以下是"Date"使用以下内容转换为类"yearmon":

library(zoo)

dates <- c(1993.07, 1993.08, 1993.09, 1993.1, 1993.11, 1993.12) # test input 


 as.Date(as.yearmon(sprintf("%.2f", dates), "%Y.%m")) # 1st of month
 ## [1] "1993-07-01" "1993-08-01" "1993-09-01" "1993-10-01" "1993-11-01" "1993-12-01"

 as.Date(as.yearmon(sprintf("%.2f", dates), "%Y.%m"), frac = 1) # last of month
 ## [1] "1993-07-31" "1993-08-31" "1993-09-30" "1993-10-31" "1993-11-30" "1993-12-31"
Run Code Online (Sandbox Code Playgroud)

或者如果测试输入如下所示:

dates.ch <- c("1993.07", "1993.08", "1993.09", "1993.10", "1993.11", "1993.12") # input 

as.Date(as.yearmon(dates.ch, "%Y.%m"))

as.Date(as.yearmon(dates.ch, "%Y.%m"), frac = 1)
Run Code Online (Sandbox Code Playgroud)

  • 好.有固定的. (2认同)