apache-spark - spark sql date functions
Convertir cadena de pyspark a formato de fecha (6)
Tengo un marco de datos de pyspark de fecha con una columna de cadena en el formato de
MM-dd-yyyy
e intento convertir esto en una columna de fecha.
Lo intenté:
df.select(to_date(df.STRING_COLUMN).alias(''new_date'')).show()
y obtengo una serie de nulos. ¿Alguien puede ayudar?
El enfoque strptime () no funciona para mí. Obtengo otra solución más limpia, usando cast:
from pyspark.sql.types import DateType
spark_df1 = spark_df.withColumn("record_date",spark_df[''order_submitted_date''].cast(DateType()))
#below is the result
spark_df1.select(''order_submitted_date'',''record_date'').show(10,False)
+---------------------+-----------+
|order_submitted_date |record_date|
+---------------------+-----------+
|2015-08-19 12:54:16.0|2015-08-19 |
|2016-04-14 13:55:50.0|2016-04-14 |
|2013-10-11 18:23:36.0|2013-10-11 |
|2015-08-19 20:18:55.0|2015-08-19 |
|2015-08-20 12:07:40.0|2015-08-20 |
|2013-10-11 21:24:12.0|2013-10-11 |
|2013-10-11 23:29:28.0|2013-10-11 |
|2015-08-20 16:59:35.0|2015-08-20 |
|2015-08-20 17:32:03.0|2015-08-20 |
|2016-04-13 16:56:21.0|2016-04-13 |
En la actualización de la respuesta aceptada, no ve el ejemplo de la función
to_date
, por lo que otra solución que lo use sería:
from pyspark.sql import functions as F
df = df.withColumn(
''new_date'',
F.to_date(
F.unix_timestamp(''STRINGCOLUMN'', ''MM-dd-yyyy'').cast(''timestamp''))
Es posible (¿preferible?) Hacer esto sin un udf:
from pyspark.sql.functions import unix_timestamp, from_unixtime
df = spark.createDataFrame(
[("11/25/1991",), ("11/24/1991",), ("11/30/1991",)],
[''date_str'']
)
df2 = df.select(
''date_str'',
from_unixtime(unix_timestamp(''date_str'', ''MM/dd/yyy'')).alias(''date'')
)
print(df2)
#DataFrame[date_str: string, date: timestamp]
df2.show(truncate=False)
#+----------+-------------------+
#|date_str |date |
#+----------+-------------------+
#|11/25/1991|1991-11-25 00:00:00|
#|11/24/1991|1991-11-24 00:00:00|
#|11/30/1991|1991-11-30 00:00:00|
#+----------+-------------------+
Actualización (1/10/2018):
Para Spark 2.2+, la mejor manera de hacerlo es probablemente utilizando las funciones
to_date
o
to_timestamp
, que admiten el argumento de
format
.
De los documentos:
>>> df = spark.createDataFrame([(''1997-02-28 10:30:00'',)], [''t''])
>>> df.select(to_timestamp(df.t, ''yyyy-MM-dd HH:mm:ss'').alias(''dt'')).collect()
[Row(dt=datetime.datetime(1997, 2, 28, 10, 30))]
Prueba esto:
df = spark.createDataFrame([(''2018-07-27 10:30:00'',)], [''Date_col''])
df.select(from_unixtime(unix_timestamp(df.Date_col, ''yyyy-MM-dd HH:mm:ss'')).alias(''dt_col''))
df.show()
+-------------------+
| Date_col|
+-------------------+
|2018-07-27 10:30:00|
+-------------------+
posiblemente no tantas respuestas, así que pensar en compartir mi código que puede ayudar a alguien
from pyspark.sql import SparkSession
from pyspark.sql.functions import to_date
spark = SparkSession.builder.appName("Python Spark SQL basic example")/
.config("spark.some.config.option", "some-value").getOrCreate()
df = spark.createDataFrame([(''2019-06-22'',)], [''t''])
df1 = df.select(to_date(df.t, ''yyyy-MM-dd'').alias(''dt''))
print df1
print df1.show()
salida
DataFrame[dt: date]
+----------+
| dt|
+----------+
|2019-06-22|
+----------+
el código anterior para convertir a fecha si desea convertir fecha y hora, luego use to_timestamp. Hazme saber si tienes alguna duda.
from datetime import datetime
from pyspark.sql.functions import col, udf
from pyspark.sql.types import DateType
# Creation of a dummy dataframe:
df1 = sqlContext.createDataFrame([("11/25/1991","11/24/1991","11/30/1991"),
("11/25/1391","11/24/1992","11/30/1992")], schema=[''first'', ''second'', ''third''])
# Setting an user define function:
# This function converts the string cell into a date:
func = udf (lambda x: datetime.strptime(x, ''%m/%d/%Y''), DateType())
df = df1.withColumn(''test'', func(col(''first'')))
df.show()
df.printSchema()
Aquí está la salida:
+----------+----------+----------+----------+
| first| second| third| test|
+----------+----------+----------+----------+
|11/25/1991|11/24/1991|11/30/1991|1991-01-25|
|11/25/1391|11/24/1992|11/30/1992|1391-01-17|
+----------+----------+----------+----------+
root
|-- first: string (nullable = true)
|-- second: string (nullable = true)
|-- third: string (nullable = true)
|-- test: date (nullable = true)