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

  • POSIXct

    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 con Sys.Time() .

  • POSIXlt

    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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow