3 votes

Pyspark to_timestamp avec timezone

J'essaie de convertir des chaînes de date avec un fuseau horaire en timestamp en utilisant to_timestamp.

Exemple de cadre de données :

df = spark.createDataFrame([("a", '2020-09-08 14:00:00.917+02:00'), 
                            ("b", '2020-09-08 14:00:00.900+01:00')], 
                           ["Col1", "date_time"])

Ma tentative (avec le fuseau horaire Z) :

df = df.withColumn("timestamp",f.to_timestamp(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSZ"))
df.select('timestamp').show()

Résultat réel :

    +---------+
    |timestamp|
    +---------+
    |     null|
    |     null|
    +---------+

Résultat souhaité (où l'horodatage est de type horodatage) :

+-------------------------+
|                timestamp|
+-------------------------+
|2020-09-08 14:00:00+02:00|
|2020-09-08 14:00:00+01:00|
+-------------------------+

J'ai essayé de nombreuses autres versions du format, mais je n'arrive pas à trouver la bonne.

3voto

suresiva Points 2676

Pour autant que je sache, il n'est pas possible d'analyser l'horodatage avec le fuseau horaire et de conserver directement sa forme originale.

Le problème est que to_timestamp() & date_format() les convertissent automatiquement dans le fuseau horaire de la machine locale.

Je peux vous suggérer d'analyser les horodatages et de les convertir en UTC comme suit,

df.withColumn('local_ts', date_format(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSX")) \
  .withColumn("timestamp_utc",to_utc_timestamp(to_timestamp(df.date_time, "yyyy-MM-dd HH:mm:ss.SSSX"), 'America/New_York')) \
  .show(10, False) 

# America/New_York is machine's timezone

+----+-----------------------------+--------------------------+-----------------------+
|Col1|date_time                    |local_ts                  |timestamp_utc          |
+----+-----------------------------+--------------------------+-----------------------+
|a   |2020-09-08 14:00:00.917+02:00|2020-09-08 08:00:00.917-04|2020-09-08 12:00:00.917|
|b   |2020-09-08 14:00:00.900+01:00|2020-09-08 09:00:00.900-04|2020-09-08 13:00:00.9  |
+----+-----------------------------+--------------------------+-----------------------+

Si vous préférez toujours conserver la forme originale, alors je suppose que vous devez rédiger un document de travail personnalisé. udf pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X