我有一个数据集,其中包含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")
答案 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)