在R中转换和分隔date

我有一个数据集,其中包含CSV中列出的一些date为dd / mm / yy,我的最终目标是将年份列分离为单独的列,但似乎给了我一些非常奇怪的结果。

当CSVinput到R时,数据集(dframe1)会自动显示date,例如8/3/05,但它们并不全是这种格式,有些是2005年8月3日,有些是08/03/2005 (因为他们应该是这样),这意味着当我转换他们时,一些date会像他们应该(即2004-11-5)和一些出现真正奇怪(即,0004-11-5)。 。我检查了Excel电子表格,他们都格式完全相同,写在相同的等,和代码是完全一样的转换,但它似乎并没有工作。

这是一个例子,看起来像我导入到R,即使在Excel中,他们都是一样的:

2 11/11/04 3 11/11/04 4 11/11/04 5 11/11/04 6 11/11/04 7 11/11/04 8 11/11/04 9 11/11/04 10 5/3/05 11 5/3/05 12 5/3/05 13 5/3/05 14 5/3/05 15 5/3/05 16 5/3/05 17 3/11/05 18 3/11/05 19 3/11/05 20 3/11/05 21 3/11/05 22 3/11/05 23 3/11/05 24 3/11/05 25 3/11/05 26 3/11/05 27 9/6/06 28 9/6/06 29 9/6/06 30 9/6/06 31 9/6/06 32 9/6/06 33 9/6/06 34 9/6/06 35 11/8/06 36 11/8/06 37 11/8/06 38 11/8/06 39 11/8/06 40 11/8/06 41 11/8/06 42 11/8/06 43 22/02/2007 44 22/02/2007 45 22/02/2007 46 22/02/2007 47 22/02/2007 48 22/02/2007 49 22/02/2007 50 7/2/08 51 7/2/08 52 7/2/08 53 7/2/08 54 7/2/08 55 7/2/08 56 8/5/08 57 8/5/08 58 8/5/08 59 8/5/08 60 25/03/2012 61 25/03/2012 62 25/03/2012 63 25/03/2012 64 25/03/2012 65 25/03/2012 

我想用来转换的代码如下:

data = dframe1

Set.date,Haul.date,Date.depart和Date.return是dframe1中的所有列

首先我确定R知道date列实际上是date(而不是因素,自动假设)

 dframe1$Set.date <- as.Date(dframe1$Set.date,"%d/%m/%Y") dframe1$Haul.date <- as.Date(dframe1$Haul.date, format ="%d/%m/%Y") dframe1$Date.depart <- as.Date(dframe1$Date.depart, format ="%d/%m/%Y") dframe1$Date.return <- as.Date(dframe1$Date.return, format ="%d/%m/%Y") 

接下来,我想分开并添加一个年份的列(也可以与日月,但不会打扰这一次)

 dframe1$Set.year <- format(dframe1$Set.date[1], "%Y") dframe1$Haul.year <- format(dframe1$Haul.date[1], "%Y") dframe1$Year.depart <- format(dframe1$Date.depart[1], "%Y") dframe1$Year.return <- format(dframe1$Date.return[1], "%Y") 

如果你所有的date都在过去的14年,那么这个工作应该是正常的。

 dat$dat2 <- gsub("/([0-9]{2})$", "/20\\1", dat$date) library(lubridate) dat$dat3 <- dmy(dat$dat2) 

gsub函数将忽略在正斜杠和string结尾之间没有正好两位数的项目。 如果你在1900年有一些价值,那么应该有方法来转换这些。 也许:

 dat$dat2 <- gsub("/([7-9][0-9])$", "/19\\1", dat$date) 

首先,Excel不会显示CSV文件中存在的date/时间string的实际文本格式,而是将其转换为Excel格式以供显示。 您应该在文本编辑器中打开您的CSV并查看date以validation格式。

其次,您可以使用lubridate软件包来更轻松地处理date/时间。 对于你的例子,你可以做这样的事情:

 library(lubridate) dframe1$Set.date <- dmy(dframe1$Set.date) dframe1$Set.year <- year(dframe1$Set.date) 

lubridate ,如果通用date格式是已知的,则可以使用诸如dmy()ymd_hms()等函数来parsing字符date。 您也可以使用parse_date_time()函数,并像在as.Date()那样指定顺序。 Lubridate还具有year()month()和其他函数来提取date/时间戳的特定元素。

Lubridate默认将date存储为POSIXct对象,而不是Date对象,但是这对你的目的应该不重要。