나는 열이 포함 된 dataframe가 start_time
와 timezone
(아래 예 참조). 는 start_time
UTC에 기록됩니다. start_time_local
해당 레코드에 대한 현지 시간대 내의 시작 시간을 포함 하는 새 열을 만들고 싶습니다 .
나는 등 많은 예 시도했습니다 format()
, force_tz()
, with_tz()
, 등,하지만 대부분의 내가 어떻게 같은 시간대에 모든 타임 스탬프를 변환하는 쇼를 본 적이 예, 그리고 그 각각의 타임 스탬프의 각각의 시간대를
+---------------------+---------------------+
| 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")
불행히도 시간대는 전체 벡터에 적용되는 단일 원자 속성으로 저장되기 때문에 단일 POSIXct 벡터 내에 다른 시간대를 가질 수 없습니다. 이 속성에 여러 시간대를 쓰려고하면 POSIXct에 대한 S3 메서드의 작동이 중지됩니다.
이것이 당신이 추구하고 싶은 것이 있다면 이러한 종류의 문제를 처리하기 위해 새로운 S3 클래스를 작성할 수 있습니다. 이러한 클래스의 맨 뼈는 다음과 같습니다.
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, ...))
}
이렇게하면 다음과 같은 동작이 가능합니다.
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
하지만 조심하십시오-POSIXct 객체를 사용하는 방식으로이 클래스를 사용할 수 있으려면 여전히 약간의 작업이 필요합니다. 초를 더하고 빼기 위해 여전히 산술 함수를 사용할 수 있지만 lubridate
패키지 또는 이와 유사한 것을 사용하는 경우 Ops
기간, 기간 등을 추가하기 위해 다양한 것을 정의하지 않는 한이 클래스에 대해 많은 메서드가 작동하지 않습니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다