如何使用正则表达式

时间:2018-05-14 18:46:46

标签: python regex pyspark

我的列open_date的字符串类型值如下所示,它们有两种不同的格式yyyymmddyyyymm

+---------+
|open_date|
+---------+
| 19500102| 
|   195001| 
+---------+

我的预期输出是

+----------+
| open_date|
+----------+
|1950-01-02|
|1950-01-01|
+----------+

我尝试使用substrsplitregex_extract将此字符串转换为日期格式。对这些知识知之甚少,其中没有成功。如何在具有不同格式的列上将字符串转换为日期类型。

2 个答案:

答案 0 :(得分:1)

您可以要求yyyymm存在,但要dd可选。如果缺少filter,则将每个人分成他们自己的捕获组dd,然后使用join分隔符'-'

>>> import re
>>> s = '19500102 195001'
>>> ['-'.join(filter(None, i)) for i in re.findall(r'(\d{4})(\d{2})(\d{2})?', s)]
['1950-01-02', '1950-01']

答案 1 :(得分:0)

如果您保证只有长度为6或8个字符的字符串,最简单的方法是将"01"附加到短字符串的末尾以指定该月的第一个字符串。

以下是使用pyspark.sql.functions.length()pyspark.sql.functions.concat()的示例:

import pyspark.sql.functions as f

df = df.withColumn(
    'open_date',
    f.when(
        f.length(f.col('open_date')) == 6,
        f.concat(f.col('open_date'), "01")
    ).otherwise(f.col('open_date'))
)
df.show()
#+---------+
#|open_date|
#+---------+
#| 19500102| 
#| 19500101| 
#+---------+

然后使用this post中描述的技术(下面的释义)转换为日期。

适用于Spark 2.1及以下

df = df.withColumn('open_date', f.from_unixtime(f.unix_timestamp('open_date', 'yyyyMMdd')))

适用于Spark 2.2 +

df = df.withColumn('open_date', f.to_date('open_date', 'yyyyMMdd'))