【问题标题】:Combining date and time columns into dd/mm/yyyy hh:mm将日期和时间列组合成 dd/mm/yyyy hh:mm
【发布时间】:2017-06-02 02:44:15
【问题描述】:

R 和 R 工作室的新手。 我已经在五个单独的列中导入了日期和时间的数据集,标题为: YYYY MM DD hh mm 如何将它们组合成 dd/mm/yyyy hh:mm 格式的单个日期列?

数据集:

【问题讨论】:

  • 请举例说明您的数据是什么样的?
  • 您可以使用 lubridate 例如假设一列是日期,另一列是时间: library(lubridate); df
  • 我附上了问题中数据集的图像。抱歉,这不是第一次上传。
  • 我不知道 lubridate 是否会起作用,因为日期的每个元素都在一个单独的列中,所以有 5 个不同的列?
  • 复制粘贴几行数据以后比一张图来帮助想帮助你的人

标签: r date as.date


【解决方案1】:

基于@LauraKate 在评论中提出的新信息和问题。

下面的答案是用 dplyrggplot2 包完成的:

df <- read.table("http://www.ndbc.noaa.gov/data/realtime2/51206.txt")
names(df) <- c("YYYY", "MM", "DD", "hh", "mm", "WD", "WSPD", "V1", "GST", "WVHT", "DPD", "APD", "MWD", "BARO", "ATMP", "V2", "V3", "V4", "V5")


df2 <- df %>% 
  unite(date, YYYY, MM, DD, sep="-") %>% 
  unite(time, hh, mm, sep=":") %>% 
  mutate(timestamp=paste(date, time) %>% 
           as.POSIXct(., format="%Y-%m-%d %H:%M")) %>% 
  select(timestamp, ATMP) 

ggplot(df2, aes(timestamp, ATMP)) + geom_line()

要在每日最高温度高于 26 摄氏度 (C) 时获得警告点?

df3 <- df2 %>% 
    mutate(date=as.Date(timestamp) %>% as.POSIXct) %>% 
    group_by(date) %>% summarise(temp=max(ATMP)) %>% 
    mutate(warnings = ifelse(temp > 26, "red", "black"))

ggplot(df2, aes(timestamp, ATMP)) + 
    geom_line() + 
    geom_point(data=df3 %>% filter(warnings=="red"), aes(date, y=27.5), color="red")

【讨论】:

  • 非常感谢!我现在将尝试复制它。当温度高于 26 时,如何获取打印时间/日期的警告?
  • 为什么是 26 度?珊瑚白化?
  • 飓风和热带气旋可以开始发展的温度:)
  • 顺便说一句,警告点很棒!但是 R 也可以打印某种警告吗?也喜欢带有时间/日期的文本警告?
  • 不。不太明白你想问什么。您可以尝试根据您的情况对数据进行子集化,这非常简单(消化已经提供的代码)。如果您感到困惑或坚持采用更动态的演示方式,请再问一个问题。编辑中已经有太多的问题对可能遇到类似问题的其他人没有好处。
【解决方案2】:

这是使用 lubridate 包的答案(一个很好的处理日期的包)。您需要将各个列粘贴或连接在一起,擦除空格,然后使用 lubridate 将其从字符串转换为日期格式。注意我使用了dmy_hms函数(您可以根据需要使用https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html中的其他函数

> df=NULL
> df$H=10
> df$M=54
> df$S=27
> df$DD=12
> df$MM=06
> df$YYYY=2007
> df=as.data.frame(df)
> df
   H  M  S DD MM YYYY
1 10 54 27 12  6 2007
> attach(df)

> df$dat1=gsub(" ","",(paste(DD,"/",MM,"/",YYYY)))
> df
   H  M  S DD MM YYYY      dat1
1 10 54 27 12  6 2007 12/6/2007
> df$tim1=gsub(" ","",(paste(H,":",M,":",S)))
> df
   H  M  S DD MM YYYY      dat1     tim1
1 10 54 27 12  6 2007 12/6/2007 10:54:27



> df$dat2=paste(df$dat1,df$tim1)
> df
   H  M  S DD MM YYYY      dat1     tim1               dat2
1 10 54 27 12  6 2007 12/6/2007 10:54:27 12/6/2007 10:54:27
> str(df)
'data.frame':   1 obs. of  9 variables:
 $ H   : num 10
 $ M   : num 54
 $ S   : num 27
 $ DD  : num 12
 $ MM  : num 6
 $ YYYY: num 2007
 $ dat1: chr "12/6/2007"
 $ tim1: chr "10:54:27"
 $ dat2: chr "12/6/2007 10:54:27"
> library(lubridate)

Attaching package: ‘lubridate’

The following object is masked from ‘package:base’:

    date

> df$dat3=dmy_hms(df$dat2)
> str(df)
'data.frame':   1 obs. of  10 variables:
 $ H   : num 10
 $ M   : num 54
 $ S   : num 27
 $ DD  : num 12
 $ MM  : num 6
 $ YYYY: num 2007
 $ dat1: chr "12/6/2007"
 $ tim1: chr "10:54:27"
 $ dat2: chr "12/6/2007 10:54:27"
 $ dat3: POSIXct, format: "2007-06-12 10:54:27"
> df
   H  M  S DD MM YYYY      dat1     tim1               dat2                dat3
1 10 54 27 12  6 2007 12/6/2007 10:54:27 12/6/2007 10:54:27 2007-06-12 10:54:27

【讨论】:

  • 非常感谢。尽管我对这个项目感到非常不知所措,但我会去尝试一下。我对 R 很陌生,需要从ndbc.noaa.gov/data/realtime2/51206.txt 获取实时数据,并创建一个仅包含日期与 WTMP (temp) 的图,并可能在需要时删除其他列。然后我需要在 26 度的图上放置一条线性线以显示最大值,然后当温度高于 26 度时让 r 打印警告......有人想帮忙吗?哈哈 有什么建议和技巧吗?
  • 再问一个问题
  • Adam Quek 在上面帮我解决了。
【解决方案3】:

您可以为此使用lubridate::make_datetime

library(dplyr)
library(lubridate)

df <- data_frame(
  YYYY = sample(2000:2017, 10),
  MM = sample(1:12, 10),
  DD = sample(1:28, 10),
  hh = sample(1:23, 10),
  mm = sample(1:59, 10)
)

mutate(df, 
  date_time = make_datetime(
    year = YYYY, month = MM, day = DD, hour = hh, min = mm
  )
)

#> # A tibble: 10 x 6
#>     YYYY    MM    DD    hh    mm           date_time
#>    <int> <int> <int> <int> <int>              <dttm>
#>  1  2007     8    11     4    27 2007-08-11 04:27:00
#>  2  2002     7     5    23    51 2002-07-05 23:51:00
#>  3  2006     2    25    12    45 2006-02-25 12:45:00
#>  4  2008    10     1     1     1 2008-10-01 01:01:00
#>  5  2000     1    28    10    42 2000-01-28 10:42:00
#>  6  2010     4    12    21    37 2010-04-12 21:37:00
#>  7  2013    12     8    16    58 2013-12-08 16:58:00
#>  8  2014     5    17    18    56 2014-05-17 18:56:00
#>  9  2009     9    27    20    36 2009-09-27 20:36:00
#> 10  2001     3    14    14    14 2001-03-14 14:14:00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2017-07-20
    • 2012-07-15
    相关资源
    最近更新 更多