在r中使用ggplot的“明确的日期格式”

时间:2017-07-12 15:38:37

标签: r ggplot2

我有一个csv文件,其中包含日期和时间列,格式为m / dd / yy H:M。我想沿着我的x轴绘制这个,沿着y轴绘制数据。我看过这篇文章:Problems creating datetime series graph in R using ggplot,但至少有一些建议似乎已经过时了。

我试着通过这个来生成图表:

discharge <- read.csv("~/mac2017/Everything_plot/discharge2.csv", header 
= TRUE, stringsAsFactors = FALSE, strip.white = TRUE)

discharge$Date_Time <- as.POSIXct(discharge$Date_Time, "%m/%d/%y %h:%m")

ggplot(data=discharge, aes(x=Date_Time, y=Discharge, type=1, group=1))+
    geom_line()+
    scale_x_date(date_labels = ("%b-%Y")) + #breaks = date_breaks("1 
month"), labels = date_format("%m/%Y"))+
    scale_y_continuous()

我已尝试将Date列格式化为Date对象,因为该帖子的答案已建议,但仍然出现此错误:

Error in as.Date(x, tx, ...) : 
character string is not in a standard unambiguous format

因此,我切换到使用as.POSIXct命令,但是一直有关于明确格式的相同错误。我尝试过使用strptime,但又一次收到同样的错误。我认为strptime会修复明确的格式错误,因为它用于指定当前格式。

这是我很长的csv的前几行:

Date        Time    Date_Time       Discharge
8/23/2016   0:00    8/23/16 0:00    92.00
8/23/2016   0:15    8/23/16 0:15    91.00
8/23/2016   0:30    8/23/16 0:30    90.00
8/23/2016   0:45    8/23/16 0:45    89.00
8/23/2016   1:00    8/23/16 1:00    88.00
8/23/2016   1:15    8/23/16 1:15    87.00
8/23/2016   1:30    8/23/16 1:30    86.00
8/23/2016   1:45    8/23/16 1:45    86.00
8/23/2016   2:00    8/23/16 2:00    86.00
8/23/2016   2:15    8/23/16 2:15    85.00
8/23/2016   2:30    8/23/16 2:30    84.00
8/23/2016   2:45    8/23/16 2:45    83.00
8/23/2016   3:00    8/23/16 3:00    82.00

我对R相当新。关于我做错了什么的想法?

2 个答案:

答案 0 :(得分:0)

考虑使用“lubridate”包。使用它比R的内置日期/时间功能更直观。例如,我可以使用mdy()函数来设置/提取日期列。或使用month()函数设置/提取月份。

答案 1 :(得分:0)

查看tidyverse有助于您进行数据导入,清理以及处理日期和时间的工具。 readr::read_csv函数和lubridate包将非常有用。

例如,我们首先加载名称空间并保存临时.csv

library(readr)
library(lubridate)
library(dplyr)
library(ggplot2)

# save data as a csv for the example
cat(
"Date,       Time,   Date_Time,      Discharge
8/23/2016,  0:00,   8/23/16 0:00,   92.00
8/23/2016,  0:15,   8/23/16 0:15,   91.00
8/23/2016,  0:30,   8/23/16 0:30,   90.00
8/23/2016,  0:45,   8/23/16 0:45,   89.00
8/23/2016,  1:00,   8/23/16 1:00,   88.00
8/23/2016,  1:15,   8/23/16 1:15,   87.00
8/23/2016,  1:30,   8/23/16 1:30,   86.00
8/23/2016,  1:45,   8/23/16 1:45,   86.00
8/23/2016,  2:00,   8/23/16 2:00,   86.00
8/23/2016,  2:15,   8/23/16 2:15,   85.00
8/23/2016,  2:30,   8/23/16 2:30,   84.00
8/23/2016,  2:45,   8/23/16 2:45,   83.00
8/23/2016,  3:00,   8/23/16 3:00,   82.00",
file = "discharge2.csv")

通过readr读取数据如下:

# read in the data via readr::read_csv, reading in all data/time columns as
# characters and the Discharge column as a number
discharge <- readr::read_csv("discharge2.csv", col_type = "cccd")

我们将为每个日期时间变量设置正确的日期时间存储模式。这是使用dplry::mutate调用和lubridate函数mdyhmmdy_hm完成的。这些函数将解析日期时间格式并相应地存储结果。

# set the date/time storage modes
discharge <-
  discharge %>%
  dplyr::mutate(Date = lubridate::mdy(Date),
                Time = lubridate::hm(Time),
                Date_Time = lubridate::mdy_hm(Date_Time))

一个简单的图形

ggplot(discharge) +
  aes(x = Date_Time, y = Discharge) +
  geom_point() + geom_line()

enter image description here