无法在R中转换和分隔日期

时间:2014-12-09 22:18:46

标签: r excel date date-conversion as.date

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

当CSV输入到R时,数据集(dframe1)会自动将日期显示为因子,例如2005年8月3日但它们并非全部采用这种格式,有些是2005年8月3日,有些是08/03/2005(应该是这样),这意味着当我转换它们时,有些日期即将到来像他们应该的那样(也就是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知道日期列实际上是日期(而不是因素,自动假设)

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")

2 个答案:

答案 0 :(得分:2)

首先,Excel没有显示CSV文件中存在的日期/时间字符串的实际文本格式 - 它将它们转换为Excel格式以供显示。您应该在文本编辑器中打开CSV并查看其中的日期以验证格式。

其次,您可以使用lubridate包来更轻松地处理日期/时间。对于您的示例,您可以执行以下操作:

library(lubridate)

dframe1$Set.date <- dmy(dframe1$Set.date)

dframe1$Set.year <- year(dframe1$Set.date)

lubridate中,如果已知日期格式,则可以使用dmy()ymd_hms()等功能解析字符日期。您也可以使用parse_date_time()功能并像as.Date()中那样指定订单。 Lubridate还具有year()month()和其他用于提取日期/时间戳的特定元素的函数。

默认情况下,Lubridate会将日期存储为POSIXct个对象,而不是Date个对象,但这对您的目的来说并不重要。

答案 1 :(得分:1)

如果您的所有日期都是过去14年,那么这应该有效:

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

dat$dat3 <- dmy(dat$dat2)

gsub函数将忽略在正斜杠和字符串结尾之间没有正好2位数的项目。如果你在1900年有一些价值观,那么应该有办法转换那些。也许:

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