2017-05-04 6 views
0

String型のDate Columnを今年の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)) 

半分私の日付が区切られているので、私は、問題が発生した「 - 」と他の半分は「/」で区切られます。ユースケースに応じて、 ' - 'または '/'のいずれかでDateを分割するには、どのようにしてandを使うことができますか?さらに、 '/'で区切られた形式はmm/dd/yyyyで、 ' - 'で区切られた形式はyyyy-mm-ddです。

日付の列を日、月、年に分けてください。

答えて

0

は、あなただけの日付フォーマットの種類を認識するために、余分なコーディングを少し必要です。 例えば、あなたのデータがでフォーマットを下回っていると言うことができます -

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| 
+--------------+----+-----+---+ 
0

はこれを試してみてください:

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

私の質問が更新されました。分割されていますが、各区切り文字に異なる形式があります。 –

+0

を入力する必要がありますので、割り当て線にさらにロジックを追加する必要があります。例えば。 4桁の場合はその年の日など – Dandekar

0

が@Pushkrソリューションに追加します。 dateutil関数を使用して日付形式をdatetimeに解析することもできます。ここでそれを行うスニペットです。

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')) 
関連する問題