如何只替换pyspark Dataframe 列中字符串的前两个字符?

kmbjn2e3  于 2022-12-17  发布在  Spark
关注(0)|答案(2)|浏览(227)

我有一个pyspark Dataframe df,其中包含列中字符串格式的日期- DTC如下所示-

DTC
11 AUG 2012 10:12
AUG 2012 10:20
13 AUG 2012 10:22

我想用连字符替换列中所有日期的前两个空格,如下所示-

DTC
11-AUG-2012 10:12
AUG-2012 10:20
13-AUG-2012 10:22

有什么建议吗?请注意,有一些部分日期在列中,以及,所以不能转换为日期数据类型,使其成为空&我会失去数据。我想保留部分日期以及。

tag5nh1u

tag5nh1u1#

您可以使用"dd MMM yyyy HH:mm"解析带有to_date的日期,然后使用您想要的"dd-MMM-yyyy HH:mm"对其进行格式化,如下所示:

from pyspark.sql import functions as f

new_df = df\
    .withColumn("date", f.to_timestamp(f.col("DTC"), "dd MMM yyyy HH:mm"))\
    .withColumn("DTC", f.date_format(f.col("date"), "dd-MMM-yyyy HH:mm"))\
    .drop("date")

另一种可能不太通用的方法是直接编辑字符串,其中一种方法是使用split,限制为3个字段和concat_ws

new_df = df.withColumn("DTC", f.concat_ws("-", f.split("DTC", " ", 3)))
wn9m85ua

wn9m85ua2#

在“部分”日期的情况下,正如在另一个答案的注解中提到的,to_timestamp会将它们设置为null。在这种情况下,我会使用一些正则表达式。例如,在下面的代码中,我提取最后一个空格之前的所有内容(date列)。然后提取最后一个空格之后的所有内容(time列)。最后,我在日期中用连字符替换空格后将它们连接起来。注意,我修剪了日期以去掉尾部空格。

from pyspark.sql import functions as f

df = spark.createDataFrame([
    (1, '11 AUG 2012 10:12'),
    (2, 'AUG 2012 10:20'),
    (3, '2012 11:11')
], ['id', 'DTC'])

df\
    .withColumn("date", f.regexp_extract("DTC", "^.* ", 0))\
    .withColumn("time", f.regexp_extract("DTC", " [^ ]*$", 0))\
    .withColumn("DTC", f.concat(f.regexp_replace(f.trim("date"), " ", "-"), "time"))\
    .show()

其产生:

+---+-----------------+-----------+------+
| id|              DTC|       date|  time|
+---+-----------------+-----------+------+
|  1|11-AUG-2012 10:12|11 AUG 2012| 10:12|
|  2|   AUG-2012 10:20|   AUG 2012| 10:20|
|  3|       2012 11:11|       2012| 11:11|
+---+-----------------+-----------+------+

然后可以删除datetime列。

相关问题