【问题标题】:Formatting Dates with non-standard format使用非标准格式格式化日期
【发布时间】:2017-07-24 12:52:41
【问题描述】:

我对这个网站比较陌生,如果我的问题对你们来说有点模糊,请原谅我。我也意识到这个主题有很多线程,但我觉得他们没有具体回答我的问题,因为它们几乎都是关于将 yy/mm/dd 更改为 dd/mm/yy 或反之亦然。

简而言之,我想要什么?我希望我现在的格式变成只有一年。

我有一列充满这种格式的日期。

31OCT2016:23:52:00.000

我在许多主题中看到您可以使用格式命令,但它们是这样的;

dates <- c("05/27/84", "07/07/05")

我有超过 100.000 次观察,因此无法手动完成。 所以我尝试了;

mydata$dates <- format(as.Date(mydata$dates), "%Y")

但这没有用。我在这个网站上看到了正确的值

http://www.statmethods.net/input/dates.html

但它没有说明如何摆脱小时分钟和秒。

那么,什么是最简单的方法来将它全部缩减到一年呢?

【问题讨论】:

  • 抱歉,它在 R

标签: r date formatting timestamp


【解决方案1】:

Lubridate 是你的朋友。准确的说是函数dmy_hms

我将生成一些与您的示例格式相同的示例数据,以便我的代码可重现。不要太担心它。为了您的目的,您可以直接跳到转换部分。

#------------------------------------------------------------------------------------------
#This code block is entirely for generating reproducible sample data

d <- sample(1:27,10,T)
mon <- toupper(sample(month.abb,10,T))
y <- sample(2000:2017,10,T)
h <- sample(0:23,10,T)
min <- sample(0:59,10,T)
s <- sample(0:59,10,T)

#load package
library(lubridate)

dts <- sprintf('%02d%s%s:%s:%s:%s.000',d,mon,y,h,min,s)

> dts
 [1] "01JAN2012:12:6:53.000"  "01NOV2010:0:19:47.000"  "03SEP2000:9:45:3.000"   "25NOV2009:21:39:57.000" "08DEC2015:19:27:36.000"
 [6] "23MAR2009:13:39:40.000" "03JUN2010:14:54:50.000" "03APR2002:6:34:45.000"  "19NOV2012:5:17:29.000"  "02FEB2003:0:3:59.000" 

#------------------------------------------------------------------------------------------

所以基本上变量dts 是您要转换的充满日期的列:

#conversion

> dmy_hms(dts)
 [1] "2012-01-01 12:06:53 UTC" "2010-11-01 00:19:47 UTC" "2000-09-03 09:45:03 UTC" "2009-11-25 21:39:57 UTC"
 [5] "2015-12-08 19:27:36 UTC" "2009-03-23 13:39:40 UTC" "2010-06-03 14:54:50 UTC" "2002-04-03 06:34:45 UTC"
 [9] "2012-11-19 05:17:29 UTC" "2003-02-02 00:03:59 UTC"

然后要获得年份,您可以使用year 函数:

> year(dmy_hms(dts))
 [1] 2012 2010 2000 2009 2015 2009 2010 2002 2012 2003

因此,假设您想在 data.frame 中执行所有操作,您的代码可能如下所示:

# example dataframe
dframe <- data.frame(variable=c('A','B','C'),dates=sample(dts,3))

这是一个带有一些变量的数据框和带有日期的列。

> dframe
  variable                 dates
1        A  15JAN2000:0:37:6.000
2        B 13DEC2016:8:34:28.000
3        C 18AUG2005:2:27:16.000

所以要转换日期,我们可以简单地做dframe$dates &lt;- year(dmy_hms(dframe$dates))

如果我们再次查看dframe,可以看到转换成功:

> dframe
  variable dates
1        A  2000
2        B  2016
3        C  2005

【讨论】:

  • 我对它还很陌生。生成数据部分我不完全理解。我不应该在那里加载我自己的数据吗?你在那里做什么?第 2 部分,如果我理解正确,这是我当前需要定义的格式,以便稍后在第 3 部分中进行格式化。'dts dts 展示 dts 的外观 然后在第 3 部分展示如何通过 ' > dmy_hms(dts)' 完成转换并显示结果。然后这里的一个后续问题是,如何将该结果放入数据集中的新列中?
  • @Val 一个补充:如果默认时间语言环境不是“英语”,您应该明确指定它:dmy_hms(dts, locale = "English")。 @Thundersheep 如果您是新手,那么使用 data.frames 阅读基本的 R 操作可能是个好主意。基本上您需要做的是:df$year &lt;- year(dmy_hms(df$date)) 其中df 是您的data.frame 的名称,date in df$date 是您的日期列的名称。
  • 嗯,很有趣@AndreyKolyadin 我按照你们俩所说的做了,它 72.000/300.000 失败了,但其他的似乎都奏效了。目前我正试图找出为什么有些有效而有些无效。
  • @Thundersheep 希望我的编辑能让它更清晰一些。 @AndreyKolyadin 如果您使用“英语”,您将收到一条警告,提示您无法使用该语言环境。我想您可以使用locale = "en_US.UTF-8" 设置语言环境
  • 会不会是因为这个?我应该调整这些数字吗? d
猜你喜欢
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2011-03-09
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多