【问题标题】:Trouble converting and separating dates in R在 R 中转换和分隔日期时遇到问题
【发布时间】:2015-02-07 23:51:27
【问题描述】:

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

当 CSV 输入到 R 中时,数据集 (dframe1) 会自动将日期显示为因子,例如05 年 8 月 3 日,但并非全部采用这种格式,有些是 2005 年 8 月 3 日,有些是 2005 年 8 月 3 日(应该是这样),这意味着当我转换它们时,一些日期即将到来像他们应该的那样(即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

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

数据 = 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")

【问题讨论】:

  • 从文本文件中发布足够的材料以进行测试,
  • 我发布了一个我想从中提取的专栏。谢谢!

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


【解决方案1】:

首先,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 对象,但这对您的目的而言并不重要。

【讨论】:

  • 谢谢@Ajar!这很有帮助。我在文本编辑器中打开了文件,确实你是对的,日期格式不同。有没有办法让所有日期格式保持一致,还是我必须在文本编辑中手动完成?
  • 这取决于它们的不同之处。如果唯一的区别是 08/05/2004 与 8/5/2004 之类的区别,则 ymd() 将以相同的方式解析这两者。
【解决方案2】:

如果您的所有日期都在过去 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)

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 2021-06-29
    • 2019-12-21
    • 1970-01-01
    相关资源
    最近更新 更多