我正在try 在Gantt类型的图表中将UTC时间调整为EET时间,其中我想绘制一些处于UTC时间的Cron曲线.这是代码.如何调整时间转换,以便Y轴在图中正确(例如AA Startime在05:00,而不是03:00)?

library(jsonlite)
library(dplyr)
library(ggplot2)
library(scales)
library(lubridate)

# JSON data
json_data <- '[
{"SchedulingName": "AA", "cronExpr": "0 3 * * *"},
{"SchedulingName": "AB", "cronExpr": "30 2 * * *"},
{"SchedulingName": "AC", "cronExpr": "30 2 * * *"},
{"SchedulingName": "AD", "cronExpr": "0 6 * * *"},
{"SchedulingName": "ADD", "cronExpr": "30 2 * * *"},
{"SchedulingName": "ADER", "cronExpr": "55 1,7 * * *"},
{"SchedulingName": "ADF", "cronExpr": "9 9 * * *"},
{"SchedulingName": "ERE", "cronExpr": "0 0 * * 0"},
{"SchedulingName": "DFA", "cronExpr": "0 5 * * *"},
{"SchedulingName": "DFD", "cronExpr": "45 6 * * *"},
{"SchedulingName": "GREW", "cronExpr": "30 2 * * *"},
{"SchedulingName": "ASDFA", "cronExpr": "9 9 * * *"},
{"SchedulingName": "AFERE", "cronExpr": "30 4 * * *"},
{"SchedulingName": "DFAARE", "cronExpr": "30 2 * * *"},
{"SchedulingName": "DFARE", "cronExpr": "9 9 * * *"},
{"SchedulingName": "DAFAD", "cronExpr": "30 2 * * *"},
{"SchedulingName": "ADWER", "cronExpr": "0 5 * * *"},
{"SchedulingName": "OASDFAS", "cronExpr": "0 3 * * *"},
{"SchedulingName": "ASDPFAS", "cronExpr": "50 2 * * *"},
{"SchedulingName": "ASDFASDF", "cronExpr": "45 3 * * *"},
{"SchedulingName": "AERED", "cronExpr": "0 22 * * *"},
{"SchedulingName": "ASDFAER", "cronExpr": "30 5,12 * * *"},
{"SchedulingName": "AREWVSD", "cronExpr": "9 9 * * *"},
{"SchedulingName": "SARAER", "cronExpr": "30 2 * * *"},
{"SchedulingName": "QEFHF", "cronExpr": "0 3 * * *"},
{"SchedulingName": "AFEREADF", "cronExpr": "30 3 * * *"},
{"SchedulingName": "UTKY", "cronExpr": "30 6 * * *"},
{"SchedulingName": "IUOU", "cronExpr": "0 5 * * *"},
{"SchedulingName": "KYDF", "cronExpr": "0 7 * * *"},
{"SchedulingName": "DSARAE", "cronExpr": "0 0 * * *"},
{"SchedulingName": "KYRT", "cronExpr": "9 9 * * *"},
{"SchedulingName": "WERRYHN", "cronExpr": "0 1 * * *"},
{"SchedulingName": "FHSUR", "cronExpr": "30 12 * * *"},
{"SchedulingName": "PIU", "cronExpr": "30 23 * * *"},
{"SchedulingName": "ASDGYHBDV", "cronExpr": "0 3 * * *"},
{"SchedulingName": "KYIUY", "cronExpr": "0 19 * * *"},
{"SchedulingName": "IRETH", "cronExpr": "9 9 * * *"},
{"SchedulingName": "JTUT", "cronExpr": "31 23 * * *"},
{"SchedulingName": "HRURJU", "cronExpr": "0 20 * * *"}
]'

# Convert JSON to DataFrame
cron_jobs <- fromJSON(json_data)
head(cron_jobs)

# Process data to extract times and create POSIXct timestamps
cron_jobs <- cron_jobs %>%
  mutate(
    Minute = as.numeric(sub("^(\\d+)\\s.*", "\\1", cronExpr)),
    Hour = as.numeric(sub("^\\d+\\s(\\d+).*", "\\1", cronExpr)),
    StartTime = as.POSIXct(paste("2024-01-01", Hour, Minute), format = "%Y-%m-%d %H %M", tz = "UTC"),
    EndTime = StartTime + 720,  # Add 12 minutes for task duration
    StartTime = as_datetime(StartTime, tz = 'Europe/Helsinki'),
    EndTime = as_datetime(EndTime, tz = "Europe/Helsinki")
  )
head(cron_jobs)

# Sort the factor levels for better visualization
cron_jobs <- cron_jobs %>%
  arrange(SchedulingName) %>%
  mutate(SchedulingName = factor(SchedulingName, levels = rev(unique(SchedulingName))))

# Date range for the Gantt chart
full_day_start <- force_tz(as.POSIXct("2024-01-01 00:00", format = "%Y-%m-%d %H:%M", tz = "UTC"), tzone = "Europe/Helsinki")
full_day_end <- force_tz(as.POSIXct("2024-01-02 00:00", format = "%Y-%m-%d %H:%M", tz = "UTC"), tzone = "Europe/Helsinki")

# Create Gantt chart
ggplot(cron_jobs, aes(x = SchedulingName, y = StartTime, xend = SchedulingName, yend = EndTime)) +
  geom_segment(size = 3, color = "red") +
  coord_flip() +
  scale_y_datetime(
    breaks = seq(full_day_start, full_day_end, by = "1 hour"),
    labels = date_format("%H:%M"),
    limits = c(full_day_start, full_day_end)
  ) +
  labs(title = "Cron Schedule Gantt Chart (EET)", x = "Task", y = "Time") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1)
  )

推荐答案

您需要向date_format声明添加时区,这似乎不仅仅是设置格式.请注意,date_format现在已被label_time取代,尽管目前两者都有效.

ggplot(cron_jobs, aes(x = SchedulingName, y = StartTime, xend = SchedulingName, 
                      yend = EndTime)) +
  geom_segment(size = 3, color = "red") +
  coord_flip() +
  scale_y_datetime(
    breaks = seq(full_day_start, full_day_end, by = "1 hour"),
    labels = label_time("%H:%M", tz = "EET"),    # or date_format(...)
    limits = c(full_day_start, full_day_end)
  ) +
  labs(title = "Cron Schedule Gantt Chart (EET)", x = "Task", y = "Time") +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1)
  )

enter image description here

R相关问答推荐

如何替换某个字符的所有出现,但如果该字符是字符串中的第一个,则不替换?

R中的枢轴/转置

R的GG平行坐标图中的排序变量

为什么观察不会被无功值变化触发?

在特定Quarto(reveal.js)幻灯片上隐藏徽标

自动变更列表

当月份额减go 当月份额

条形图和在Ploly中悬停的问题

使用rest从header(h2,h3,table)提取分层信息

根据现有列的名称和字符串的存在进行变异以创建多个新列

R中边际效应包中Logistic回归的交互作用风险比

查找所有站点的最小值

将全局环境变量的名称分配给列表中的所有元素

在点图上绘制置信度或预测区间ggplot2

R中时间间隔的大向量与参考时间间隔的相交

层次树图的数据树

为R中的16组参数生成10000个样本的有效方法是什么?

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

数据集上的R循环和存储模型系数

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?