WebHU - Programozási kérdések és válaszok

Konvertálja az UTC dátumidőt helyi dátumidőre az időzónával

Van egy adatkeretem, amely a start_time és timezone oszlopokat tartalmazza (az alábbi példa). A start_time UTC-ben van rögzítve. Szeretnék létrehozni egy új oszlopot start_time_local néven, amely tartalmazza az adott rekord helyi időzónán belüli kezdési idejét.

Sok példát kipróbáltam, beleértve a format(), force_tz(), with_tz() stb., de a legtöbb példa azt mutatja be, hogyan lehet MINDEN időbélyeget ugyanarra az időzónára konvertálni, és nem minden időbélyeget a megfelelő időzónára.

+---------------------+---------------------+
|     start_time      |      timezone       |
+---------------------+---------------------+
| 2020-07-07 16:01:15 | Europe/Dublin       |
| 2020-07-07 21:01:28 | America/Los_Angeles |
| 2020-07-20 12:45:33 | America/New_York    |
| 2020-07-24 16:00:32 | America/Los_Angeles |
| 2020-07-09 14:00:39 | Europe/London       |
| 2020-07-16 20:30:30 | America/Los_Angeles |
| 2020-07-29 14:03:09 | Europe/London       |
| 2020-07-27 20:59:32 | America/Los_Angeles |
| 2020-07-20 16:09:54 | America/Denver      |
| 2020-07-21 09:51:04 | Europe/Dublin       |
+---------------------+---------------------+
# example data
df <- structure(list(start_time = structure(c(1594162875, 1594180888, 
1595274333, 1595631632, 1594328439, 1594956630, 1596056589, 1595908772, 
1595286594, 1595350264), class = c("POSIXct", "POSIXt"), tzone = ""), 
    timezone = c("Europe/Dublin", "America/Los_Angeles", "America/New_York", 
    "America/Los_Angeles", "Europe/London", "America/Los_Angeles", 
    "Europe/London", "America/Los_Angeles", "America/Denver", 
    "Europe/Dublin")), row.names = c(NA, -10L), class = "data.frame")
06.10.2020

Válaszok:


1

Sajnos egyetlen POSIXct vektoron belül nem lehetnek különböző időzónák, mert az időzóna egyetlen atomi attribútumként van tárolva, amely a teljes vektorra vonatkozik. Ha több időzónát próbál írni ehhez az attribútumhoz, a POSIXct S3 metódusai leállnak.

Ha ezt nagyon szeretné elérni, írhat egy új S3 osztályt az ilyen jellegű problémák kezelésére. Egy ilyen osztály nagyon csupasz csontjai valahogy így néznének ki:

POSIX_multi_tz <- function(UTC_times, time_zones)
{
  structure(as.numeric(UTC_times), 
            class = c("POSIXmulti", "POSIXt"), 
            tz = time_zones)
}

format.POSIXmulti <- function(x, ...)
{
  unlist(mapply(function(a, b) {
    format(as.POSIXct(a, origin = "1970-01-01"), tz = b, usetz = TRUE)
    }, a = x, b = attr(x, "tz"), SIMPLIFY = FALSE))
}

print.POSIXmulti <- function(x, ...)
{
  print(format(x, ...))
}

Ez a következő viselkedést teszi lehetővé:

df$new_time <- POSIX_multi_tz(df$start_time, df$timezone)

df
#>             start_time            timezone                new_time
#> 1  2020-07-08 00:01:15       Europe/Dublin 2020-07-08 00:01:15 IST
#> 2  2020-07-08 05:01:28 America/Los_Angeles 2020-07-07 21:01:28 PDT
#> 3  2020-07-20 20:45:33    America/New_York 2020-07-20 15:45:33 EDT
#> 4  2020-07-25 00:00:32 America/Los_Angeles 2020-07-24 16:00:32 PDT
#> 5  2020-07-09 22:00:39       Europe/London 2020-07-09 22:00:39 BST
#> 6  2020-07-17 04:30:30 America/Los_Angeles 2020-07-16 20:30:30 PDT
#> 7  2020-07-29 22:03:09       Europe/London 2020-07-29 22:03:09 BST
#> 8  2020-07-28 04:59:32 America/Los_Angeles 2020-07-27 20:59:32 PDT
#> 9  2020-07-21 00:09:54      America/Denver 2020-07-20 17:09:54 MDT
#> 10 2020-07-21 17:51:04       Europe/Dublin 2020-07-21 17:51:04 IST

Vigyázz azonban – még mindig van egy kis munka, hogy ezt az osztályt úgy tudja használni, ahogyan a POSIXct objektumokat használná. Az aritmetikai függvényeket továbbra is használhatja a másodpercek hozzáadására és kivonására, de ha a lubridate csomagot vagy hasonlót használja, sok metódus nem fog működni ennél az osztálynál, hacsak nem határoz meg különböző Ops-eket az időtartamok, pontok stb. hozzáadásának kezelésére.

06.10.2020
  • `[[.POSIXmulti` <- function(x, i, ...) { stopifnot(length(i) == 1); x[i]; } (feltörés, nem biztos, hogy jobb módszerrel bővíthető a [[ metódus) 06.10.2020
  • Sajnos olyan funkciók, mint a rev és a sort, sok/legtöbb/minden attribútumot kivonnak, így a "tz" elvész. 06.10.2020
  • ez elég vonzónak tűnik ahhoz, hogy önmagában is népszerű legyen. Érdekel egy ilyen csomag kidolgozása? Többször eszembe jut, hogy hol fogadtam el az R egy-TZ végrehajtását... és bár elég kényelmes vagyok vele, úgy érzem, nagyon hasznos lenne, ha opcionálisan megtartanám az egyes zónákat. 06.10.2020
  • @r2evans bravó! Különösen az alkészlet-operátorok létfontosságúak. Hasznos lenne egy as.POSIXmulti <- function(x) useMethod("as.POSIXmulti") általános is. A legnehezebb számomra az lenne, hogy jól működjön kenőanyaggal, és annak biztosítása, hogy jól működjön az ábrázolási módszerekkel. Természetesen minden nagyon kezelhető probléma. Örömmel jelentkezem, ha repót szeretnél indítani a Git-eden. 07.10.2020
  • Tovább... Nem tudom megfelelően megjeleníteni egy keretben (vagy tibble-ben vagy DT-ben), csak a 1.59e+09 értéket látom... de a legtöbb művelet továbbra is működik a fentiekkel. A másik aggodalmam azokra a dolgokra vonatkozik, amelyek nem veszik észre a "tz" attribútum véletlen eltávolítását, ami bizonyos eszközökben nem ritka. Tudja, hogy a str mit használ a formázáshoz? 07.10.2020
  • @r2evans szóval a reprexem nem írja ki a df-t a válasz szerint? Az attribútumok eltávolítása önmagában a POSIXct problémája. Ezen gyakran kiakadok, ha pl. sapply 07.10.2020
  • Úgy látom, str.default-nek szüksége lenne egy módszerre, de nem tudom, hogy a data.frame miért nem jó nekem. (Jól nézett ki neked, így nem tudom, mi húzza ki. Jelenleg én is hibakeresőben vagyok, szóval lehet, hogy van néhány névterem.) 07.10.2020
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..