我的列open_date
的字符串类型值如下所示,它们有两种不同的格式yyyymmdd
和yyyymm
+---------+
|open_date|
+---------+
| 19500102|
| 195001|
+---------+
我的预期输出是
+----------+
| open_date|
+----------+
|1950-01-02|
|1950-01-01|
+----------+
我尝试使用substr
,split
和regex_extract
将此字符串转换为日期格式。对这些知识知之甚少,其中没有成功。如何在具有不同格式的列上将字符串转换为日期类型。
答案 0 :(得分:1)
您可以要求yyyy
和mm
存在,但要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'))