Как преобразовать строки datetime с заданным смещением UTC в эквивалентное datetime с более узким смещением UTC в Python

#python #apache-spark #datetime #pyspark #utc

#python #apache-spark #datetime #pyspark #utc

Вопрос:

У меня есть записная книжка Python Databricks, которая получает внешние данные, содержащие строки datetime со смещениями UTC между UTC-24:00 и UTC 24:00. Примером строки datetime является « 2020-06-26T03:05:52 20:00 . Однако я также использую библиотеку (Spark 3.x использует Java DateTimeFormatter), которая поддерживает только смещения UTC между UTC-18:00 и UTC 18:00. В Spark 3.x функция pyspark to_timestamp() возвращает null значения datetimes со смещением UTC, которые находятся за пределами диапазона /- 18:00.

Пример кода:

 from pyspark.sql import SparkSession
from pyspark.sql import functions as F

spark = SparkSession.builder.master("local[2]").appName("test") 
  .config("spark.driver.memory", "2g") 
  .config("spark.executor.memory", "1g") 
  .config('spark.driver.extraJavaOptions', '-Duser.timezone=GMT') 
  .config('spark.executor.extraJavaOptions', '-Duser.timezone=GMT') 
  .config('spark.sql.session.timeZone', 'UTC') 
  .getOrCreate()

columns = ["datetime", "offset"]
data = [
  ("2020-06-26T03:05:52 20:00", " 20:00"),
  ("2020-06-26T03:05:52 02:00", " 2:00"),
]
test_df = spark.createDataFrame(data).toDF(*columns)

test_df_two = test_df.withColumn(
  'to_ts', F.to_timestamp(F.col("datetime"))
)
test_df_two.show(truncate=False)
  

Вывод:

  ------------------------- ------ ------------------- 
|datetime                 |offset|to_ts              |
 ------------------------- ------ ------------------- 
|2020-06-26T03:05:52 20:00| 20:00|null               |
|2020-06-26T03:05:52 02:00| 2:00 |2020-06-26 01:05:52|
 ------------------------- ------ ------------------- 
  

Как я могу в общем случае преобразовать такие строки datetime в эквивалентные, которые находятся в пределах / — 18:00, установленного моей библиотекой?

Комментарии:

1. Можете ли вы сосредоточиться на классе, который отказывается анализировать большие смещения часовых поясов? Неясно, проблема в Spark или во встроенном в Java материале. Пример, который показывает только поведение проблемного класса, был бы действительно отличным.

2. Я нахожу, что java.time. ZonedDateTime.parse выдает исключение, когда смещение tz превышает 18 часов, так что, возможно, в этом причина проблемы. Это сводит с ума — я не вижу никакого оператора в ZonedDateTime, java.time.format . DateTimeFormatter или даже страница Википедии для ISO 8601 (извините, я не смог найти нормативную ссылку) о допустимом диапазоне для смещения tz. В отсутствие официального заявления об этом, похоже, что разработчики материала для анализа даты сделали ограничительное предположение о том, что является «разумным». Хм.

3. «В 2008 году смещения часовых поясов по всему миру расширились с -12:00 до 14:00. Чтобы предотвратить какие-либо проблемы с расширением этого диапазона, но при этом обеспечить проверку, диапазон смещений ограничен от -18:00 до 18:00 включительно. » Из : docs.oracle.com/javase/8/docs/api/java/time/ZoneOffset.html

4. Ха, ну это чушь. Это все равно, что сказать: «Количество атомов во вселенной несколько меньше 1e82, поэтому анализатор чисел выдает ошибку для чего-либо большего». Я все же хотел бы ознакомиться с тем, что на самом деле говорит или не говорит спецификация о смещении.

5. Изменение поведения в Spark 3.x упоминается в руководстве по миграции здесь ( spark.apache.org/docs/latest /… ) в соответствии с пунктом 12