I see this as first & foremost a data wrangling problem, with the ggplot part coming afterwards.
Since there's no sample data in the question, let's simulate some:
library(dplyr)
set.seed(12345)
data <- data.frame(
  Date = seq.POSIXt(from = ISOdate(2018, 1, 1),
                    to = ISOdate(2018, 5, 1),
                    by = "hour")
) %>%
  mutate(Return = rnorm(n = n()),
         PredReturn = rnorm(n = n()))
data$Date[c(220:350,
            593:820,
            2100:2500)] <- NA
data <- na.omit(data)
#which creates a dataset with 3 distinctive gaps in its time periods
ggplot(data,
       aes(x = Date, group = 1)) +
  geom_line(aes(y = Return)) +
  geom_line(aes(y = PredReturn), color = "red") +
  theme_light()

We can identify time gaps by comparing the time difference between consecutive time stamps. Here, the logic I used defines a gap as any time difference larger than the median of all time differences. You may want to change that to some other value (e.g. 2 days? 1 week?) depending on your context:
data2 <- data %>%
  arrange(Date) %>%
  mutate(date.diff = c(NA, diff(Date))) %>%
  mutate(is.gap = !is.na(date.diff) & date.diff > median(date.diff, na.rm = TRUE)) %>%
  mutate(period.id = cumsum(is.gap))
> head(data2)
                 Date     Return PredReturn date.diff is.gap period.id
1 2018-01-01 12:00:00  0.5855288 -0.7943254        NA  FALSE         0
2 2018-01-01 13:00:00  0.7094660  1.8875074         1  FALSE         0
3 2018-01-01 14:00:00 -0.1093033  0.5881879         1  FALSE         0
4 2018-01-01 15:00:00 -0.4534972  1.1556793         1  FALSE         0
5 2018-01-01 16:00:00  0.6058875 -0.8743878         1  FALSE         0
6 2018-01-01 17:00:00 -1.8179560  0.2586568         1  FALSE         0
Now each period.id value corresponds to a subset of data without major time differences within its rows. We can further wrangle this data by converting it to long format:
data2 <- data2 %>%
  select(-date.diff, -is.gap) %>% # drop unneeded columns
  tidyr::gather(color, y, -Date, -period.id) %>%
  mutate(color = factor(color,
                        levels = c("Return", "PredReturn")))
> head(data2)
                 Date period.id  color          y
1 2018-01-01 12:00:00         0 Return  0.5855288
2 2018-01-01 13:00:00         0 Return  0.7094660
3 2018-01-01 14:00:00         0 Return -0.1093033
4 2018-01-01 15:00:00         0 Return -0.4534972
5 2018-01-01 16:00:00         0 Return  0.6058875
6 2018-01-01 17:00:00         0 Return -1.8179560
Pass this data to ggplot(), facet by time periods with free scales, & you'd have eliminated the blank spaces from the earlier plot above:
p <- ggplot(data2,
       aes(x = Date, y = y, color = color)) +
  geom_line() +
  facet_grid(~ period.id, scales = "free_x", space = "free_x") +
  scale_color_manual(values = c("Return" = "black",
                                "PredReturn" = "red")) +
  theme_light()
p

Further tweaks to the plot's aesthetics can hide the blank spaces completely, though I'd caution against going to extremes without making the time gaps very clear to your intended audience, as this can be subject to misinterpretation:
p +
  scale_x_datetime(expand = c(0, 0),             # remove space within each panel
                   breaks = "5 days") +          # specify desired time breaks
  theme(panel.spacing = unit(0, "pt"),           # remove space between panels
        axis.text.x = element_text(angle = 90))  # rotate x-axis text
