如何将时间戳转换为字符串(不更改时区)?
how to convert a timestamp into string (without changing timezone)?
我在 sparklyr
中将一些 unix 时间转换为时间戳,出于某些原因,我还需要将它们转换为字符串。
不幸的是,似乎在转换为字符串的过程中 hive
转换为 EST(我的语言环境)。
df_new <- spark_read_parquet(sc, "/mypath/parquet_*",
overwrite = TRUE,
name = "df_new",
memory = FALSE,
options = list(mergeSchema = "true"))
> df_new %>%
mutate(unix_t = from_utc_timestamp(timestamp(t) ,'UTC'),
date_str = date_format(unix_t, 'yyyy-MM-dd HH:mm:ss z'),
date_alt = to_date(from_utc_timestamp(timestamp(t) ,'UTC'))) %>%
select(t, unix_t, date_str, date_alt) %>% head(5)
# Source: lazy query [?? x 4]
# Database: spark_connection
t unix_t date_str date_alt
<dbl> <dttm> <chr> <date>
1 1419547405. 2014-12-25 22:43:25 2014-12-25 17:43:25 EST 2014-12-25
2 1418469714. 2014-12-13 11:21:54 2014-12-13 06:21:54 EST 2014-12-13
3 1419126103. 2014-12-21 01:41:43 2014-12-20 20:41:43 EST 2014-12-20
4 1419389856. 2014-12-24 02:57:36 2014-12-23 21:57:36 EST 2014-12-23
5 1418271811. 2014-12-11 04:23:31 2014-12-10 23:23:31 EST 2014-12-10
如您所见,date_str
和 date_alt
都使用 EST
时区。我需要 UTC
这里。我该怎么做?
谢谢!
可能是 sparklyr 对时区进行了一些奇怪的转换为配置单元函数。我会尝试将数据框注册为 table 并使用纯 HQL 进行操作:
createOrReplaceTempView(df_new, "df_new")
result <- sql("select from_utc_timestamp(timestamp(t) ,'UTC'),
cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING),
cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE)
from df_new")
head(result)
编辑
如果您不熟悉 SQL-languages,您可以像这样将 df_new
中的任何变量添加为逗号分隔列表(并使用 as
重命名您的选择)
select var1, var2, t,
from_utc_timestamp(timestamp(t) ,'UTC') as unix_t,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING) as date_str,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE) as date_alt
from df_new
您也可以使用 * 来表示数据框中的所有变量:
select *,
from_utc_timestamp(timestamp(t) ,'UTC') as unix_t,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING) as date_str,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE) as date_alt
from df_new
尝试使用 as.POSIXct() ?
format(as.POSIXct(unix_t, origin = unix_t, tz = "UTC", usetz=TRUE),"%Y-%m-%d %H:mm:ss")
这将首先将 unix 时间戳转换为 UTC,然后格式化为所需的字符串。
来自 Hive 函数参考,date_format uses Java's SimpleDateFormat,我相信它始终默认为 JVM 时区,这解释了为什么这会让您将字符串转换为您的时区。
一种选择是检测时区并手动添加小时以获得 UTC。
另一种选择是使用 lubridate
和 spark_apply()
:
sdf_len(sc, 1) %>%
mutate(unix_t = from_utc_timestamp(timestamp(1522371003) , 'UDT')) %>%
spark_apply(
function(e) {
dplyr::mutate(
e,
time_str = as.character(
lubridate::with_tz(
as.POSIXct(unix_t, origin="1970-01-01"),
"GMT"
)
)
)
},
columns = c("id", "unix_t", "time_str"))
我在 sparklyr
中将一些 unix 时间转换为时间戳,出于某些原因,我还需要将它们转换为字符串。
不幸的是,似乎在转换为字符串的过程中 hive
转换为 EST(我的语言环境)。
df_new <- spark_read_parquet(sc, "/mypath/parquet_*",
overwrite = TRUE,
name = "df_new",
memory = FALSE,
options = list(mergeSchema = "true"))
> df_new %>%
mutate(unix_t = from_utc_timestamp(timestamp(t) ,'UTC'),
date_str = date_format(unix_t, 'yyyy-MM-dd HH:mm:ss z'),
date_alt = to_date(from_utc_timestamp(timestamp(t) ,'UTC'))) %>%
select(t, unix_t, date_str, date_alt) %>% head(5)
# Source: lazy query [?? x 4]
# Database: spark_connection
t unix_t date_str date_alt
<dbl> <dttm> <chr> <date>
1 1419547405. 2014-12-25 22:43:25 2014-12-25 17:43:25 EST 2014-12-25
2 1418469714. 2014-12-13 11:21:54 2014-12-13 06:21:54 EST 2014-12-13
3 1419126103. 2014-12-21 01:41:43 2014-12-20 20:41:43 EST 2014-12-20
4 1419389856. 2014-12-24 02:57:36 2014-12-23 21:57:36 EST 2014-12-23
5 1418271811. 2014-12-11 04:23:31 2014-12-10 23:23:31 EST 2014-12-10
如您所见,date_str
和 date_alt
都使用 EST
时区。我需要 UTC
这里。我该怎么做?
谢谢!
可能是 sparklyr 对时区进行了一些奇怪的转换为配置单元函数。我会尝试将数据框注册为 table 并使用纯 HQL 进行操作:
createOrReplaceTempView(df_new, "df_new")
result <- sql("select from_utc_timestamp(timestamp(t) ,'UTC'),
cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING),
cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE)
from df_new")
head(result)
编辑
如果您不熟悉 SQL-languages,您可以像这样将 df_new
中的任何变量添加为逗号分隔列表(并使用 as
重命名您的选择)
select var1, var2, t,
from_utc_timestamp(timestamp(t) ,'UTC') as unix_t,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING) as date_str,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE) as date_alt
from df_new
您也可以使用 * 来表示数据框中的所有变量:
select *,
from_utc_timestamp(timestamp(t) ,'UTC') as unix_t,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as STRING) as date_str,
cast(from_utc_timestamp(timestamp(t) ,'UTC') as DATE) as date_alt
from df_new
尝试使用 as.POSIXct() ?
format(as.POSIXct(unix_t, origin = unix_t, tz = "UTC", usetz=TRUE),"%Y-%m-%d %H:mm:ss")
这将首先将 unix 时间戳转换为 UTC,然后格式化为所需的字符串。
来自 Hive 函数参考,date_format uses Java's SimpleDateFormat,我相信它始终默认为 JVM 时区,这解释了为什么这会让您将字符串转换为您的时区。
一种选择是检测时区并手动添加小时以获得 UTC。
另一种选择是使用 lubridate
和 spark_apply()
:
sdf_len(sc, 1) %>%
mutate(unix_t = from_utc_timestamp(timestamp(1522371003) , 'UDT')) %>%
spark_apply(
function(e) {
dplyr::mutate(
e,
time_str = as.character(
lubridate::with_tz(
as.POSIXct(unix_t, origin="1970-01-01"),
"GMT"
)
)
)
},
columns = c("id", "unix_t", "time_str"))