переходы на летнее время R ось даты и времени - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть график с датами на оси X, и я хочу добавить штриховку, чтобы различать выходные и праздничные дни.Я подумал, что могу сделать это с помощью POSIXct.Я определяю функцию, чтобы выяснить, является ли день выходным:

weekend<-function(data) {
  d<-weekdays(data)
  ifelse (d %in% c("niedziela","sobota", "Sunday", "Sun", "Saturday", "Sat"), "weekend", "working")
}

Затем я определяю свои наборы данных - фактический набор данных и таблицу выходных:

dates=as.character(seq(as.Date("2018-10-24"), as.Date("2018-11-01"), "day"))
numbers=rnorm(length(dates))

tabela=data.table(dates=as.POSIXct(dates), numbers=numbers)
tabela[,day_type:=weekend(dates)]

tab_weekend<-tabela[day_type=='weekend']
tab_weekend[,Start:=dates-12*60*60+1]
tab_weekend[,Stop:=dates+12*60*60]

Затем я строю графикчисла в виде строки, а выходные - в виде серых прямоугольников.

g<-ggplot(tabela)+
  geom_line(aes(dates, numbers))+
  geom_rect(data=tab_weekend, aes(xmin=Start, xmax=Stop, ymin=-Inf, ymax=+Inf), 
            fill='gray65', alpha=0.2)+
  scale_x_datetime(labels=function(x) format(x, "%Y-%m-%d %H:%M"))

Пока все хорошо:

enter image description here

Но если ятеперь используйте больший диапазон дат,

dates=as.character(seq(as.Date("2018-10-01"), as.Date("2018-11-01"), "day"))

Я получаю тики каждую неделю, что само по себе не является проблемой, но теперь последний тик показывает неправильную дату.По пункту 29.10.(Понедельник) это говорит 28.10.23:00.

enter image description here

Я предполагаю, что это происходит потому, что 28.10.это первый день зимнего времени, поэтому у него 25 часов.Но как мне исправить, чтобы отображались правильные даты?

РЕДАКТИРОВАТЬ: было предложено использовать date_format с аргументом tz, как в R: as.POSIXct timezone и scale_x_datetime в моем наборе данных .Однако, с

scale_x_datetime(labels=date_format("%Y-%m-%d", tz = "Europe/Berlin"))

я все еще вижу тики для 10-15, 10-22 и затем 10-28.

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, что вы правы, это проблема с часовым поясом, я могу воспроизвести ее здесь, в Нидерландах (CET или CEST летом).

Но решить эту проблему, я думаю, проще, если вы перестанете думать в date-times в целом.Это зависит от ваших реальных данных, но похоже, что у вас есть ежедневные данные, и время в любом случае не имеет никакого реального значения.
Что вы также можете увидеть в своем примере: все числа отображаются в начале дня, в полночь.Это имеет смысл, если вы планируете какое-то измерение, которое всегда выполняется в полночь, но не если вы строите что-то, что охватывает весь день.
Кроме того, как показано на графике, вы определяете странный вид выходных: он начинается в полдень пятницы.и заканчивается в воскресенье полдень.

Так что использование дат, вероятно, имеет больше смысла, когда я изменяю ваш код, я получаю это (я также изменил преобразование дат в символы, это не нужно):

 dates=seq(as.Date("2018-10-24"), as.Date("2018-11-01"), "day")
 numbers=rnorm(length(dates))

 tabela=data.table(dates=dates, numbers=numbers)
 tabela[,day_type:=weekend(dates)]

 tab_weekend<-tabela[day_type=='weekend']
 tab_weekend[,Start:=dates-.5]
 tab_weekend[,Stop:=dates+.5]

 print(g<-ggplot(tabela)+
         geom_line(aes(dates, numbers))+
         geom_rect(data=tab_weekend, aes(xmin=Start, xmax=Stop, ymin=-Inf, ymax=+Inf), 
                   fill='gray65', alpha=0.2)+
         scale_x_date(labels=function(x) format(x, "%Y-%m-%d")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...