R Language
Datum en tijd
Zoeken…
Invoering
R wordt geleverd met klassen voor datums, datum-tijden en tijdsverschillen; zie ?Dates
?difftime
?DateTimeClasses
?difftime
en volg de sectie "Zie ook" van die documenten voor verdere documentatie. Gerelateerde documenten: datums en datum-tijdklassen .
Opmerkingen
Klassen
Een datum-tijdklasse, POSIXct slaat tijd op als seconden sinds het UNIX-tijdperk op
1970-01-01 00:00:00 UTC
. Het is het formaat dat wordt geretourneerd wanneer de huidige tijd wordt getrokken metSys.Time()
.Een datum-tijdklasse, slaat een lijst op van dag, maand, jaar, uur, minuut, seconde, enzovoort. Dit is het formaat dat wordt geretourneerd door
strptime
.Datum De enige datumklasse, slaat de datum op als een getal met drijvende komma.
Een datum-tijdnotatie selecteren
POSIXct is de enige optie in de opruiming en de wereld van UNIX. Het is sneller en neemt minder geheugen in beslag dan POSIXlt.
origin = as.POSIXct("1970-01-01 00:00:00", format ="%Y-%m-%d %H:%M:%S", tz = "UTC")
origin
## [1] "1970-01-01 UTC"
origin + 47
## [1] "1970-01-01 00:00:47 UTC"
as.numeric(origin) # At epoch
## 0
as.numeric(Sys.time()) # Right now (output as of July 21, 2016 at 11:47:37 EDT)
## 1469116057
posixlt = as.POSIXlt(Sys.time(), format ="%Y-%m-%d %H:%M:%S", tz = "America/Chicago")
# Conversion to POISXct
posixct = as.POSIXct(posixlt)
posixct
# Accessing components
posixlt$sec # Seconds 0-61
posixlt$min # Minutes 0-59
posixlt$hour # Hour 0-23
posixlt$mday # Day of the Month 1-31
posixlt$mon # Months after the first of the year 0-11
posixlt$year # Years since 1900.
ct = as.POSIXct("2015-05-25")
lt = as.POSIXlt("2015-05-25")
object.size(ct)
# 520 bytes
object.size(lt)
# 1816 bytes
Gespecialiseerde pakketten
- op elk gewenst moment
- data.table IDate en ITime
- snelle tijd
- lubridate
- nanotime
Huidige datum en tijd
R heeft toegang tot de huidige datum, tijd en tijdzone:
Sys.Date() # Returns date as a Date object
## [1] "2016-07-21"
Sys.time() # Returns date & time at current locale as a POSIXct object
## [1] "2016-07-21 10:04:39 CDT"
as.numeric(Sys.time()) # Seconds from UNIX Epoch (1970-01-01 00:00:00 UTC)
## [1] 1469113479
Sys.timezone() # Time zone at current location
## [1] "Australia/Melbourne"
Gebruik OlsonNames()
om de tijdzonenamen in de Olson / IANA-database op het huidige systeem te bekijken:
str(OlsonNames())
## chr [1:589] "Africa/Abidjan" "Africa/Accra" "Africa/Addis_Ababa" "Africa/Algiers" "Africa/Asmara" "Africa/Asmera" "Africa/Bamako" ...
Ga naar het einde van de maand
Laten we zeggen dat we naar de laatste dag van de maand willen gaan, deze functie helpt daarbij:
eom <- function(x, p=as.POSIXlt(x)) as.Date(modifyList(p, list(mon=p$mon + 1, mday=0)))
Test:
x <- seq(as.POSIXct("2000-12-10"),as.POSIXct("2001-05-10"),by="months")
> data.frame(before=x,after=eom(x))
before after
1 2000-12-10 2000-12-31
2 2001-01-10 2001-01-31
3 2001-02-10 2001-02-28
4 2001-03-10 2001-03-31
5 2001-04-10 2001-04-30
6 2001-05-10 2001-05-31
>
Een datum in een tekenreeksindeling gebruiken:
> eom('2000-01-01')
[1] "2000-01-31"
Ga naar de eerste dag van de maand
Laten we zeggen dat we naar de eerste dag van een bepaalde maand willen gaan:
date <- as.Date("2017-01-20")
> as.POSIXlt(cut(date, "month"))
[1] "2017-01-01 EST"
Verplaats een datum een aantal maanden consequent met maanden
Laten we zeggen dat we een bepaalde datum een num
maanden willen verplaatsen. We kunnen de volgende functie definiëren, die het mondate
pakket gebruikt:
moveNumOfMonths <- function(date, num) {
as.Date(mondate(date) + num)
}
Het beweegt consequent het maandgedeelte van de datum en past de dag aan, voor het geval de datum verwijst naar de laatste dag van de maand.
Bijvoorbeeld:
Terug een maand:
> moveNumOfMonths("2017-10-30",-1)
[1] "2017-09-30"
Twee maanden terug:
> moveNumOfMonths("2017-10-30",-2)
[1] "2017-08-30"
Twee maanden vooruit:
> moveNumOfMonths("2017-02-28", 2)
[1] "2017-04-30"
Het verplaatst zich twee maanden vanaf de laatste dag van februari, dus de laatste dag van april.
Laten we eens kijken hoe het werkt voor achterwaartse en voorwaartse bewerkingen wanneer het de laatste dag van de maand is:
> moveNumOfMonths("2016-11-30", 2)
[1] "2017-01-31"
> moveNumOfMonths("2017-01-31", -2)
[1] "2016-11-30"
Omdat november 30 dagen heeft, krijgen we dezelfde datum in de achterwaartse bewerking, maar:
> moveNumOfMonths("2017-01-30", -2)
[1] "2016-11-30"
> moveNumOfMonths("2016-11-30", 2)
[1] "2017-01-31"
Omdat januari 31 dagen heeft, krijgt twee maanden verplaatsen vanaf de laatste dag van november de laatste dag van januari.