Tengo un marco de datos pyspark de fecha con una columna de cadena en el formato de MM-dd-yyyyy estoy intentando convertir esto en una columna de fecha.
Lo intenté:
df.select(to_date(df.STRING_COLUMN).alias('new_date')).show()
y obtengo una cadena de nulos. ¿Alguien puede ayudar?

groupByoperaciones de remuestreo. Simplemente realícelos en las columnas de la cadena.groupBysino más bien longitudinales, de los registros médicos. Por lo tanto, es importante poder manipular la fechaRespuestas:
Actualización (10/1/2018):
Para Spark 2.2+, la mejor manera de hacer esto probablemente sea usando las funciones
to_dateoto_timestamp, que son compatibles con elformatargumento. De los documentos:>>> from pyspark.sql.functions import to_timestamp >>> 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))]Respuesta original (para Spark <2.2)
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| #+----------+-------------------+fuente
to_date()con el argumento de formato es Spark 2.2+.to_dateexistía antes de 2.2, pero la opción de formato no existíafrom 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á el resultado:
+----------+----------+----------+----------+ | 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)fuente
udfno debería ser necesario en este caso, pero los muebles empotrados para el manejo de esto son atroz. Esto es lo que haría yo también por ahora.El enfoque strptime () no me funciona. 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 |fuente
2008-08-01T14:45:37Zuna marca de tiempo en lugar de una fecha,df = df.withColumn("CreationDate",df['CreationDate'].cast(TimestampType()))funciona bien ... (Spark 2.2.0)En la actualización de la respuesta aceptada, no ve el ejemplo de la
to_datefunción, por lo que otra solución que la 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')))fuente
posiblemente no tantas respuestas, así que estoy pensando en compartir mi código, lo 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 la fecha si desea convertir la fecha y hora, luego use to_timestamp. Hazme saber si tienes alguna duda.
fuente
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| +-------------------+fuente