pyspark 中的日期格式
Format for dates in pyspark
我有一个带有日期列的数据框,其中存在不同类型的日期格式。我只想验证和提取日期格式为 'MM-dd-yy'
的记录,但是当我验证和提取时,我也得到格式为 ''MM-dd-yyyy'.
的记录 提取格式为 '[ 的记录的正确格式是什么=14=]
from pyspark.sql import functions as F,Window
df = sc.parallelize([['12-21-20'],
['05-30-2020'],
['01-01-1984'],
['12-24-20']]).toDF(["Date"])
df.show()
+----------+
| Date|
+----------+
| 12-21-20|
|05-30-2020|
|01-01-1984|
| 12-24-20|
+----------+
spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
df=df.filter(~F.col("Date").isNotNull()|
to_date(F.col("Date"),'MM-dd-yy').isNotNull())
display(df)
+----------+
| Date|
+----------+
| 12-21-20|
|05-30-2020|
|01-01-1984|
| 12-24-20|
+----------+
预期输出:
+----------+
| Date|
+----------+
| 12-21-20|
| 12-24-20|
+----------+
您可以将格式指定为 MM-dd-yyyy
,它会将 00
附加到带有 2 位数字的年份,您可以根据它进行过滤。
df.where(to_date(F.col("Date"),'MM-dd-yyyy').rlike('^00[1-9]+') &
to_date(F.col("Date"),'MM-dd-yyyy').isNotNull()).show()
+--------+
| Date|
+--------+
|12-21-20|
|12-24-20|
+--------+
我找到了一种不使用 to_date
而是 regexp_extract
的简单方法
df = df.filter((F.regexp_extract('Date', '(\d{2}-\d{2}-\d{2})$', 1) != '') &
(F.to_date('Date', 'MM-dd-yy').isNotNull()))
df.show()
+--------+
| Date|
+--------+
|12-21-20|
|12-24-20|
+--------+
使用 rlike 和 to_date
>>> df.filter((f.col("Date").rlike('^\d{2}-\d{2}-\d{2}$'))
& (f.to_date(f.col("Date"), "MM-dd-yy")).isNotNull()).show()
+--------+
| Date|
+--------+
|12-21-20|
|12-24-20|
+--------+
我有一个带有日期列的数据框,其中存在不同类型的日期格式。我只想验证和提取日期格式为 'MM-dd-yy'
的记录,但是当我验证和提取时,我也得到格式为 ''MM-dd-yyyy'.
的记录 提取格式为 '[ 的记录的正确格式是什么=14=]
from pyspark.sql import functions as F,Window
df = sc.parallelize([['12-21-20'],
['05-30-2020'],
['01-01-1984'],
['12-24-20']]).toDF(["Date"])
df.show()
+----------+
| Date|
+----------+
| 12-21-20|
|05-30-2020|
|01-01-1984|
| 12-24-20|
+----------+
spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
df=df.filter(~F.col("Date").isNotNull()|
to_date(F.col("Date"),'MM-dd-yy').isNotNull())
display(df)
+----------+
| Date|
+----------+
| 12-21-20|
|05-30-2020|
|01-01-1984|
| 12-24-20|
+----------+
预期输出:
+----------+
| Date|
+----------+
| 12-21-20|
| 12-24-20|
+----------+
您可以将格式指定为 MM-dd-yyyy
,它会将 00
附加到带有 2 位数字的年份,您可以根据它进行过滤。
df.where(to_date(F.col("Date"),'MM-dd-yyyy').rlike('^00[1-9]+') &
to_date(F.col("Date"),'MM-dd-yyyy').isNotNull()).show()
+--------+
| Date|
+--------+
|12-21-20|
|12-24-20|
+--------+
我找到了一种不使用 to_date
而是 regexp_extract
df = df.filter((F.regexp_extract('Date', '(\d{2}-\d{2}-\d{2})$', 1) != '') &
(F.to_date('Date', 'MM-dd-yy').isNotNull()))
df.show()
+--------+
| Date|
+--------+
|12-21-20|
|12-24-20|
+--------+
使用 rlike 和 to_date
>>> df.filter((f.col("Date").rlike('^\d{2}-\d{2}-\d{2}$'))
& (f.to_date(f.col("Date"), "MM-dd-yy")).isNotNull()).show()
+--------+
| Date|
+--------+
|12-21-20|
|12-24-20|
+--------+