如何在Pyspark中的列中添加天数(小时,分钟和秒)

bq9c1y66  于 4个月前  发布在  Spark
关注(0)|答案(2)|浏览(58)

我有一个pyspark数据框,有2列:“Date_ini”,“Days_to_add”。
在Date_ini中,我有一个日期,Days_to_add包含了我想加上Date_ini以获得Date_limit的天数。
我的代码是:

df = df.withColumn("Date_limit", expr("date_add(Date_ini,Days_to_add)")

字符串
我得到这个:
| 起始日期(_I)|添加天数|日期限制(_L)|
| --|--|--|
| 2023年10月11日09时03分47秒| 10 |2023年10月21日|
| 2023年10月16日15时08分53秒| 10 |2023年10月26日星期五|
| 2023年10月16日16时17分22秒| 6 |2023年10月22日|
但我想要的是:
| 起始日期(_I)|添加天数|日期限制(_L)|
| --|--|--|
| 2023年10月11日09时03分47秒| 10 |2023年10月21日09时03分47秒|
| 2023年10月16日15时08分53秒| 10 |2023年10月26日15时08分53秒|
| 2023年10月16日16时17分22秒| 6 |2023年10月22日16时17分22秒|

mnemlml8

mnemlml81#

你可以通过将days_to_add转换为DayTimeIntervalType并直接添加它来避免unix时间戳的来回转换。

from pyspark.sql import types as T
from pyspark.sql import functions as F

_data = [
    (datetime(2023, 10, 11, 9, 3, 47), 10, ),
    (datetime(2023, 10, 16, 15, 8, 53), 10, ),
    (datetime(2023, 10, 16, 16, 17, 22), 6, ),
]
_schema = ['date_ini', 'days_to_add']
df = spark.createDataFrame(_data, _schema)

day_field = T.DayTimeIntervalType.DAY
day_interval_type = T.DayTimeIntervalType(day_field, day_field)
days_to_add = F.col('days_to_add').cast(day_interval_type)

df = df.withColumn('date_limit', F.col('date_ini') + days_to_add)
df.show()

# +-------------------+-----------+-------------------+
# |           date_ini|days_to_add|         date_limit|
# +-------------------+-----------+-------------------+
# |2023-10-11 09:03:47|         10|2023-10-21 09:03:47|
# |2023-10-16 15:08:53|         10|2023-10-26 15:08:53|
# |2023-10-16 16:17:22|          6|2023-10-22 16:17:22|
# +-------------------+-----------+-------------------+

字符串

z9ju0rcb

z9ju0rcb2#

是的,最后我用这个工作:)

df = df.withColumn("Date_limit", expr("from_unixtime(unix_timestamp(concat_ws(' ', Date_ini, Days_to_add)) + (`Days_to_add` * 3600 * 24))"))

字符串

相关问题