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

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

  • POSIXlt

    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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow