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

bq9c1y66  于 2024-01-06  发布在  Spark
关注(0)|答案(2)|浏览(291)

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

  1. 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时间戳的来回转换。

  1. from pyspark.sql import types as T
  2. from pyspark.sql import functions as F
  3. _data = [
  4. (datetime(2023, 10, 11, 9, 3, 47), 10, ),
  5. (datetime(2023, 10, 16, 15, 8, 53), 10, ),
  6. (datetime(2023, 10, 16, 16, 17, 22), 6, ),
  7. ]
  8. _schema = ['date_ini', 'days_to_add']
  9. df = spark.createDataFrame(_data, _schema)
  10. day_field = T.DayTimeIntervalType.DAY
  11. day_interval_type = T.DayTimeIntervalType(day_field, day_field)
  12. days_to_add = F.col('days_to_add').cast(day_interval_type)
  13. df = df.withColumn('date_limit', F.col('date_ini') + days_to_add)
  14. df.show()
  15. # +-------------------+-----------+-------------------+
  16. # | date_ini|days_to_add| date_limit|
  17. # +-------------------+-----------+-------------------+
  18. # |2023-10-11 09:03:47| 10|2023-10-21 09:03:47|
  19. # |2023-10-16 15:08:53| 10|2023-10-26 15:08:53|
  20. # |2023-10-16 16:17:22| 6|2023-10-22 16:17:22|
  21. # +-------------------+-----------+-------------------+

字符串

展开查看全部
z9ju0rcb

z9ju0rcb2#

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

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

字符串

相关问题