R Language
Datum och tid
Sök…
Introduktion
R kommer med klasser för datum, datum-tider och tidsskillnader; se ?Dates
, ?DateTimeClasses
, ?difftime
och följ avsnittet "Se också" i dessa dokument för ytterligare dokumentation. Relaterade dokument: Datum och klasser för datum och tid .
Anmärkningar
Klasser
POSIXct lagrar tiden som sekunder sedan UNIX-epoken
1970-01-01 00:00:00 UTC
. Det är det format som returneras när du drar aktuell tid medSys.Time()
.En klass för datum-tid, lagrar en lista med dag, månad, år, timme, minut, sekund och så vidare. Detta är formatet som returneras av
strptime
.Datum Den enda datumklassen lagrar datumet som ett flytande punktnummer.
Välja ett datum-tid-format
POSIXct är det enda alternativet i UNIX tidyverse och värld. Det är snabbare och tar mindre minne än 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
Specialiserade paket
- helst
- data.table IDate och ITime
- snabb tid
- lubridate
- nanotime
Aktuellt datum och tid
R har tillgång till aktuellt datum, tid och tidszon:
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"
Använd OlsonNames()
att visa OlsonNames()
i Olson / IANA-databasen på det aktuella systemet:
str(OlsonNames())
## chr [1:589] "Africa/Abidjan" "Africa/Accra" "Africa/Addis_Ababa" "Africa/Algiers" "Africa/Asmara" "Africa/Asmera" "Africa/Bamako" ...
Gå till slutet av månaden
Låt oss säga att vi vill gå till den sista dagen i månaden, den här funktionen hjälper till med det:
eom <- function(x, p=as.POSIXlt(x)) as.Date(modifyList(p, list(mon=p$mon + 1, mday=0)))
Testa:
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
>
Använda ett datum i ett strängformat:
> eom('2000-01-01')
[1] "2000-01-31"
Gå till månadens första dag
Låt oss säga att vi vill gå till den första dagen i en viss månad:
date <- as.Date("2017-01-20")
> as.POSIXlt(cut(date, "month"))
[1] "2017-01-01 EST"
Flytta ett datum ett antal månader konsekvent efter månader
Låt oss säga att vi vill flytta ett visst datum ett num
månader. Vi kan definiera följande funktion som använder mondate
:
moveNumOfMonths <- function(date, num) {
as.Date(mondate(date) + num)
}
Det rör sig konsekvent om månadens del av datumet och justerar dagen, om datumet avser den sista dagen i månaden.
Till exempel:
Tillbaka en månad:
> moveNumOfMonths("2017-10-30",-1)
[1] "2017-09-30"
Två månader tillbaka:
> moveNumOfMonths("2017-10-30",-2)
[1] "2017-08-30"
Framåt två månader:
> moveNumOfMonths("2017-02-28", 2)
[1] "2017-04-30"
Det flyttar två månader från den sista dagen i februari, därför den sista dagen i april.
Låt oss se hur det fungerar för bakåt och framåt när det är den sista dagen i månaden:
> moveNumOfMonths("2016-11-30", 2)
[1] "2017-01-31"
> moveNumOfMonths("2017-01-31", -2)
[1] "2016-11-30"
Eftersom november har 30 dagar får vi samma datum i den bakåtgående operationen, men:
> moveNumOfMonths("2017-01-30", -2)
[1] "2016-11-30"
> moveNumOfMonths("2016-11-30", 2)
[1] "2017-01-31"
Eftersom januari har 31 dagar, då kommer att flytta två månader från den sista dagen i november att få den sista dagen i januari.