将另一列中的分钟添加到pyspark中的字符串时间列

9avjhtql  于 2023-01-17  发布在  Apache
关注(0)|答案(3)|浏览(126)

我有下面的pyspark Dataframe 。两者都是字符串列。

time     additional_time_in_mins
11:00:00 60
13:00:00 60
14:00:00 30

我必须将附加时间列中的分钟数添加到实际时间中,并在pyspark中创建如下输出。
预期产出:

new_time
12:00:00
14:00:00
14:30:00

在pyspark有办法做到这一点吗

kgsdhlau

kgsdhlau1#

使用UDF执行此操作的其他方法:

from pyspark.sql.functions import date_format, col
data = [
  ("11:00:00", "60"),
  ("13:00:00", "60"),
  ("14:00:00", "30"),
]
df = spark.createDataFrame(data, ["time", "additional_time_in_mins"])
df.show()

求和时间的自定义逻辑

from pyspark.sql.types import StringType, IntegerType
from pyspark.sql.functions import udf
@udf(returnType=StringType())
def sum_time(var_time, additional_time):
  # Converting var_time string to time
  var_time = datetime.strptime(var_time, '%H:%M:%S').time()
  #Using date to utitlise the time function
  combined_time = (datetime.combine(date.today(), var_time) + timedelta(minutes=additional_time)).time()
  return str(combined_time)

使用UDF获得最终输出:

df = df.withColumn(
  "total_time", sum_time(col("time"), col("additional_time_in_mins").cast(IntegerType()))
)
display(df)

js4nwp54

js4nwp542#

下面的pyspark代码对我有效:

df = df.withColumn('time_end',col('time_start')+expr('INTERVAL 5 minutes))
nfg76nw0

nfg76nw03#

一个简单的选项是使用unix_timestamp函数将time列转换为 bigint(以秒为单位),加上分钟(minutes * 60s),然后将结果转换回 timestamp
最后,转换为小时格式。

df = df.withColumn('new_time', F.date_format((F.unix_timestamp('time', 'HH:mm:ss') + F.col('additional_time_in_mins')*60).cast('timestamp'), 'HH:mm:ss'))

df.show()

+--------+-----------------------+--------+
|    time|additional_time_in_mins|new_time|
+--------+-----------------------+--------+
|11:00:00|                     60|12:00:00|
|13:00:00|                     60|14:00:00|
|14:00:00|                     30|14:30:00|
+--------+-----------------------+--------+

相关问题