python - PySpark 1.5 如何将时间戳从秒截断到最近的分钟

标签 python datetime apache-spark apache-spark-sql pyspark

我正在使用 PySpark。我在数据框('canon_evt')中有一列('dt'),这是一个时间戳。我正在尝试从 DateTime 值中删除秒数。它最初是作为字符串从 parquet 读入的。然后我尝试通过

将其转换为时间戳
canon_evt = canon_evt.withColumn('dt',to_date(canon_evt.dt))
canon_evt= canon_evt.withColumn('dt',canon_evt.dt.astype('Timestamp'))

然后我想删除秒。我尝试了“trunc”、“date_format”,甚至尝试像下面这样将片段连接在一起。我认为它需要某种映射和 lambda 组合,但我不确定时间戳是否是合适的格式,以及是否有可能摆脱秒。

canon_evt = canon_evt.withColumn('dyt',year('dt') + '-' + month('dt') +
    '-' + dayofmonth('dt') + ' ' + hour('dt') + ':' + minute('dt'))

[Row(dt=datetime.datetime(2015, 9, 16, 0, 0),dyt=None)]

最佳答案

Spark >= 2.3

您可以使用date_trunc

df.withColumn("dt_truncated", date_trunc("minute", col("dt"))).show()

## +-------------------+-------------------+
## |                 dt|       dt_truncated|
## +-------------------+-------------------+
## |1970-01-01 00:00:00|1970-01-01 00:00:00|
## |2015-09-16 05:39:46|2015-09-16 05:39:00|
## |2015-09-16 05:40:46|2015-09-16 05:40:00|
## |2016-03-05 02:00:10|2016-03-05 02:00:00|
## +-------------------+-------------------+

Spark < 2.3

转换为 Unix 时间戳和基本算术应该是诀窍:

from pyspark.sql import Row
from pyspark.sql.functions import col, unix_timestamp, round

df = sc.parallelize([
    Row(dt='1970-01-01 00:00:00'),
    Row(dt='2015-09-16 05:39:46'),
    Row(dt='2015-09-16 05:40:46'),
    Row(dt='2016-03-05 02:00:10'),
]).toDF()


## unix_timestamp converts string to Unix timestamp (bigint / long)
## in seconds. Divide by 60, round, multiply by 60 and cast
## should work just fine.
## 
dt_truncated = ((round(unix_timestamp(col("dt")) / 60) * 60)
    .cast("timestamp"))

df.withColumn("dt_truncated", dt_truncated).show(10, False)
## +-------------------+---------------------+
## |dt                 |dt_truncated         |
## +-------------------+---------------------+
## |1970-01-01 00:00:00|1970-01-01 00:00:00.0|
## |2015-09-16 05:39:46|2015-09-16 05:40:00.0|
## |2015-09-16 05:40:46|2015-09-16 05:41:00.0|
## |2016-03-05 02:00:10|2016-03-05 02:00:00.0|
## +-------------------+---------------------+

关于python - PySpark 1.5 如何将时间戳从秒截断到最近的分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34232042/

相关文章:

python - 多处理池 - 如果返回所需结果,如何取消所有正在运行的进程?

c++ - boost::date_time::days_until_weekday 的编译错误

python - 对不同字典中相同键的多个值求和 Python

scala - Spark scala - 在 df 中查找非零行

python - Postgresql:将本地数据库迁移到 PythonAnywhere 数据库

python - 用来自两个不同列表的值替换列表的 boolean 值

python - 找到匹配的字符串并打印后面的单词

javascript - 如何使用 Knockout 和自定义绑定(bind)将 JSON DateTime 转换为可读的日期和时间

scala - 不止一个 Spark 上下文错误

java - 如何在 HDInsight 中将外部 jar 添加到 Spark?