将日期拆分为年,月和日,且分隔符不一致

时间:2017-05-04 18:47:20

标签: python apache-spark pyspark

我正在尝试将我的Date Column(即String Type)拆分为3列Year,Month和Date。我用(PySpark):

split_date=pyspark.sql.functions.split(df['Date'], '-')     
df= df.withColumn('Year', split_date.getItem(0))
df= df.withColumn('Month', split_date.getItem(1))
df= df.withColumn('Day', split_date.getItem(2))

我遇到了一个问题,因为我的一半日期用' - '分隔,另一半用'/'分隔。我如何使用和/或操作将日期分为“ - ”或“/”,具体取决于用例。另外,当它用'/'分隔时,格式为mm / dd / yyyy,当用' - '分隔时,格式为yyyy-mm-dd。

我希望将Date列分为Day,Month和Year。

3 个答案:

答案 0 :(得分:1)

您只需要一些额外的编码来识别日期格式的类型。 例如,假设您的数据采用以下格式 -

data = [("2008-05-01",1),("2018-01-01",2),("03/14/2017",3),("01/01/2018",4)]
df = spark.createDataFrame(data,schema=['date','key'])

df.show()

+----------+---+
|      date|key|
+----------+---+
|2008-05-01|  1|
|2018-01-01|  2|
|03/14/2017|  3|
|01/01/2018|  4|
+----------+---+

from pyspark.sql.functions import *
from pyspark.sql.types import *

# udf that recognise pattern and return list of year,month and day
def splitUDF(row):
    if "/" in row:
        mm,dd,yyyy = row.split("/")
    elif "-" in row:
        yyyy,mm,dd = row.split("-")

    return [yyyy,mm,dd]


datSplitterUDF = udf(lambda row : splitUDF(row),ArrayType(StringType()))
df\
.select(datSplitterUDF(df.date).alias("dt"))\
.withColumn('year',col('dt').getItem(0).cast('int'))\
.withColumn('month',col('dt').getItem(1).cast('int'))\
.withColumn('day',col('dt').getItem(2).cast('int'))\
.show()

输出:

+--------------+----+-----+---+
|            dt|year|month|day|
+--------------+----+-----+---+
|[2008, 05, 01]|2008|    5|  1|
|[2018, 01, 01]|2018|    1|  1|
|[2017, 03, 14]|2017|    3| 14|
|[2018, 01, 01]|2018|    1|  1|
+--------------+----+-----+---+

答案 1 :(得分:0)

试试这个:

split_date=pyspark.sql.functions.split(df['Date'], '[-/]')

答案 2 :(得分:0)

添加@Pushkr解决方案。您还可以使用dateutil函数将日期格式解析为日期时间。这是一个片段。

import pyspark.sql.functions as func
from pyspark.sql.types import *
from dateutil import parser

def parse_date(date):
    dt = parser.parse(date)
    return [dt.year, dt.month, dt.day]
udf_parse_date = func.udf(lambda x: parse_date(x), returnType=ArrayType(IntegerType()))

data = [("2008-05-01",1), ("2018-01-01",2), ("03/14/2017",3), ("01/01/2018",4)]
df = spark.createDataFrame(data, schema=['date','key'])
df = df.select('date', 'key', udf_parse_date('date').alias('date_parse'))
df_parsed = df.select('key', 
                      func.col('date_parse').getItem(0).alias('year'), 
                      func.col('date_parse').getItem(1).alias('month'), 
                      func.col('date_parse').getItem(2).alias('day'))