R Language
Data e ora
Ricerca…
introduzione
R include classi per date, date e orari e differenze temporali; vedi ?Dates
?DateTimeClasses
?difftime
e segui la sezione "Vedi anche" di quei documenti per ulteriore documentazione. Documenti correlati: Date e Date-Time Classes .
Osservazioni
Classi
Una classe data-ora, POSIXct memorizza il tempo in secondi dall'epoca UNIX nel
1970-01-01 00:00:00 UTC
. È il formato restituito quando si trascina l'ora corrente conSys.Time()
.Una classe data-ora, memorizza un elenco di giorno, mese, anno, ora, minuto, secondo e così via. Questo è il formato restituito da
strptime
.Data L'unica classe data, memorizza la data come numero a virgola mobile.
Selezione di un formato data-ora
POSIXct è l'unica opzione nel tidyverse e nel mondo di UNIX. È più veloce e occupa meno memoria di 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
Pacchetti specializzati
- in qualsiasi momento
- data.table IDate e ITime
- fasttime
- lubridate
- nanotime
Data e ora correnti
R è in grado di accedere alla data, ora e fuso orario attuali:
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"
Utilizzare OlsonNames()
per visualizzare i nomi dei fusi orari nel database Olson / IANA sul sistema corrente:
str(OlsonNames())
## chr [1:589] "Africa/Abidjan" "Africa/Accra" "Africa/Addis_Ababa" "Africa/Algiers" "Africa/Asmara" "Africa/Asmera" "Africa/Bamako" ...
Vai alla fine del mese
Diciamo che vogliamo andare all'ultimo giorno del mese, questa funzione ci aiuterà su:
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
>
Utilizzando una data in un formato stringa:
> eom('2000-01-01')
[1] "2000-01-31"
Vai al primo giorno del mese
Diciamo che vogliamo andare al primo giorno di un determinato mese:
date <- as.Date("2017-01-20")
> as.POSIXlt(cut(date, "month"))
[1] "2017-01-01 EST"
Sposta una data di un numero di mesi in modo coerente per mesi
Diciamo che vogliamo spostare una certa data un num
di mesi. Possiamo definire la seguente funzione, che utilizza il pacchetto mondate
:
moveNumOfMonths <- function(date, num) {
as.Date(mondate(date) + num)
}
Si sposta in modo coerente la parte del mese della data e regolando il giorno, nel caso in cui la data si riferisce all'ultimo giorno del mese.
Per esempio:
Indietro un mese:
> moveNumOfMonths("2017-10-30",-1)
[1] "2017-09-30"
Indietro due mesi:
> moveNumOfMonths("2017-10-30",-2)
[1] "2017-08-30"
Inoltra due mesi:
> moveNumOfMonths("2017-02-28", 2)
[1] "2017-04-30"
Passa due mesi dall'ultimo giorno di febbraio, quindi l'ultimo giorno di aprile.
Vediamo come funziona per le operazioni di andata e ritorno quando è l'ultimo giorno del mese:
> moveNumOfMonths("2016-11-30", 2)
[1] "2017-01-31"
> moveNumOfMonths("2017-01-31", -2)
[1] "2016-11-30"
Poiché novembre ha 30 giorni, otteniamo la stessa data nell'operazione di backward, ma:
> moveNumOfMonths("2017-01-30", -2)
[1] "2016-11-30"
> moveNumOfMonths("2016-11-30", 2)
[1] "2017-01-31"
Perché gennaio ha 31 giorni, quindi spostando due mesi dall'ultimo giorno di novembre si otterrà l'ultimo giorno di gennaio.