Ημερομηνίες και ημερολογιακά δεδομένα
### Athanassios Stavrakoudis ### astavrak@uoi.gr library(tidyverse) library(lubridate) library(scales) library(glue) #this is not a date d <- "1/10/2020" is.Date(d) # this is not a date d <- "2020-10-01" is.Date(d) # this is a Date d <- as.Date("2020-10-01") d # format a date Sys.setlocale("LC_TIME", "en_US.UTF-8") # format exports text/string # year format(d, "%Y") format(d, "%y") #month format(d, "%m") format(d, "%B") format(d, "%b") #day format(d, "%d") format(d, "%A") format(d, "%a") # day of format(d, "%w") # Weekday, Sunday -> 0 format(d, "%U") # Sunday starting format(d, "%W") # Monday Starting format(d, "%j") # of the year ## full format format(d, "%Y-%m-%d") format(d, "%d/%m/%y") format(d, "%m/%d/%Y") format(d, "%A, %d %B %Y") format(d, "%A, %d of %B %Y") # read a formatted date x <- format(d, "%A, %d %B %Y") is.character(x) as.Date(x) as.Date(x, format = "%A, %d %B %Y") # maybe conversion to numeric is needed sometimes x <- format(d, "%j") is.numeric(x) is.character(x) x <- as.numeric(x) is.numeric(x) # simple date arithmetics d + 1 d + 150 d - 1 d - 150 d + weeks(2) d - weeks(2) d + months(3) d - months(3) d + years(1) d - years(1) # more complex arithmetics d + months(1) + weeks(1) d - months(3) + weeks(1) ## intervals between two dates d1 <- Sys.Date() d2 <- as.Date("2019-05-26") d3 <- as.Date("2021-05-01") difftime(d1, d2) difftime(d1, d2, unit = "days") difftime(d1, d2, unit = "weeks") # lubridate intervals di <- interval(d2, d1) time_length(di, unit = "day") time_length(di, unit = "week") time_length(di, unit = "month") time_length(di, unit = "year") di <- interval(d1, d3) time_length(di, unit = "day") time_length(di, unit = "week") time_length(di, unit = "month") time_length(di, unit = "year") ## floor /ceiling of a date, returns Date d1 floor_date(d1, unit = "week") floor_date(d1, unit = "week", week_start = 7) # Sunday floor_date(d1, unit = "week", week_start = 1) # Monday floor_date(d1, unit = "month") floor_date(d1, unit = "bimonth") floor_date(d1, unit = "quarter") floor_date(d1, unit = "halfyear") floor_date(d1, unit = "year") x <- floor_date(d1, unit = "year") is.character(x) is.Date(x) # first date of next period ceiling_date(d1, unit = "week") ceiling_date(d1, unit = "week", week_start = 7) # Sunday ceiling_date(d1, unit = "week", week_start = 1) # Monday ceiling_date(d1, unit = "month") ceiling_date(d1, unit = "bimonth") ceiling_date(d1, unit = "quarter") ceiling_date(d1, unit = "halfyear") ceiling_date(d1, unit = "year") # last date of current period ceiling_date(d1, unit = "week") - 1 ceiling_date(d1, unit = "month") - 1 ceiling_date(d1, unit = "bimonth") - 1 ceiling_date(d1, unit = "quarter") - 1 ceiling_date(d1, unit = "halfyear") - 1 ceiling_date(d1, unit = "year") - 1 ## construct Date object from numbers and strings # numbers y <- 2020 m <- 10 d <- 1 paste(y, m, d, sep = "-") x <- paste(y, m, d, sep = "-") as.Date(x) ymd(x) paste(d, m, y, sep = "-") x <- paste(d, m, y, sep = "-") as.Date(x) # fail dmy(x) # pass x <- glue("{y}-{m}-{d}") as.Date(x) ymd(x) x <- glue("{d}/{m}/{y}") as.Date(x) # fail dmy(x) # pass # parts as strings d <- "01" m <- "10" y <- "2020" paste(y, m, d, sep = "-") x <- paste(y, m, d, sep = "-") as.Date(x) ymd(x) x <- glue("{y}-{m}-{d}") as.Date(x) ymd(x) # mixed parts d <- 1 m <- "October" y <- 2020 x <- paste(d, m, y, sep = "-") x as.Date(x) as.Date(x, format = "%d-%B-%Y") dmy(x) # convert formatted strings to dates d <- "01/10/20" as.Date(d) as.Date(d, format = "%d/%m/%y") dmy(d) d <- "01/10/2020" as.Date(d) as.Date(d, format = "%d/%m/%Y") dmy(d) d <- "10/01/2020" as.Date(d) as.Date(d, format = "%m/%d/%Y") mdy(d) ## Date sequences # between two dates d1 <- as.Date("2020-10-01") d2 <- as.Date("2021-12-31") seq.Date(from = d1, to = d2, by = "15 day") seq.Date(from = d1, to = d2, by = "1 week") seq.Date(from = d1, to = d2, by = "2 month") seq.Date(from = d1, to = d2, by = "1 quarter") seq.Date(from = d1, to = d2, by = "1 year") seq.Date(from = d1, by = "1 month", length.out = 15) seq.Date(from = d1, by = "4 week", length.out = 4) seq.Date(from = d1, to = d2, length.out = 12) # first Monday of next month d <- Sys.Date() + months(1) x <- seq.Date(from = floor_date(d, unit = "month"), to = ceiling_date(d, unit = "month") - 1, by = "1 day") x[wday(x, week_start = 1) == 1 & day(x) <= 7] # last Friday of previous month d <- Sys.Date() - months(1) x <- seq.Date(from = floor_date(d, unit = "month"), to = ceiling_date(d, unit = "month") - 1, by = "1 day") x[wday(x, week_start = 1) == 5 & day(x) > length(x) - 7] f0 <- as.Date("2020-10-31") f1 <- floor_date(f0, unit = "month") - 1 f0 f1
Συνδεθείτε για περισσότερες δυνατότητες αλληλεπίδρασης,
σχολιασμοί, εξωτερικοί σύνδεσμοι, βοήθεια, ψηφοφορίες, αρχεία, κτλ.
σχολιασμοί, εξωτερικοί σύνδεσμοι, βοήθεια, ψηφοφορίες, αρχεία, κτλ.
Εκπαιδευτικό υλικό από τον
Αθανάσιο Σταυρακούδη
σας παρέχετε κάτω από την άδεια
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License.
Σας παρακαλώ να ενημερωθείτε για κάποιους επιπλέον περιορισμούς
http://stavrakoudis.econ.uoi.gr/stavrakoudis/?iid=401.