Преобразование метки времени строки в DateTime в pyspark - PullRequest
0 голосов
/ 01 апреля 2019

Разбор отметки времени «06/06/2019 7:30 AM» на отметку времени 24 часа IN pyspark

Это схема My Dataframe:

    root
     |-- Customer_Site_ID: string (nullable = true)
     |-- ReceivedDate: string (nullable = true)
     |-- BattV: double (nullable = true)

преобразование в 24 часа DateTime

from pyspark.sql.functions import to_timestamp
# raw_data_10_sites=raw_data_10_sites.withColumn("ReceivedDate_New", to_timestamp('ReceivedDate', "dd/mm/yyyy hh:mm a"))
raw_data_10_sites.select(to_timestamp(raw_data_10_sites.ReceivedDate, "dd/mm/yyyy HH:mm a").alias('New_RD')).show(10)

Фактическая колонка- Ниже приведен мой столбец ReceivedDate.

+-------------------+
|       ReceivedDate|
+-------------------+
| 06/02/2019 7:30 AM|
| 06/02/2019 8:01 AM|
| 06/02/2019 8:30 AM|
| 06/02/2019 8:49 AM|
| 06/02/2019 8:50 AM|
| 06/02/2019 8:52 AM|
| 06/02/2019 9:30 AM|
| 06/02/2019 9:46 AM|
| 06/02/2019 9:53 AM|
|06/02/2019 10:03 AM|
|06/02/2019 10:17 AM|
|06/02/2019 10:19 AM|
|06/02/2019 10:23 AM|
|06/02/2019 10:49 AM|
|06/02/2019 10:55 AM|
|06/02/2019 10:58 AM|
|06/02/2019 11:30 AM|
|06/02/2019 11:49 AM|
|06/02/2019 12:00 PM|
|06/02/2019 12:02 PM|
+-------------------+

Но я получил это -

+-------------------+
|             New_RD|
+-------------------+
|2019-01-06 07:30:00|
|2019-01-06 08:01:00|
|2019-01-06 08:30:00|
|2019-01-06 08:49:00|
|2019-01-06 08:50:00|
|2019-01-06 08:52:00|
|2019-01-06 09:30:00|
|2019-01-06 09:46:00|
|2019-01-06 09:53:00|
|2019-01-06 10:03:00|
+-------------------+

МЕСЯЦ ПОЛНОСТЬЮ НЕПРАВИЛЬНО, МОЖЕТ ЛИБО ПОМОЧЬ? Я перепробовал много функций, но у меня это не сработало. Я также просмотрел много блогов, но эта проблема уникальна. Я просто не понимаю, как это возможно?

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

M onth и M inute оба начинаются с буквы M, , поэтому для однозначного форматирования времени нам нужен способ отличить их, еслимы будем использовать сокращение.

В случае to_timestamp функция , вы должны использовать соглашения SimpleDateFormat .В этом случае m означает минута , а M означает Месяц .

Итак: когда вы передаете строку от "dd/mm/yyyy HH:mm a" до to_timestamp,Вы говорите, что строка 06/02/2019 должна интерпретироваться как 6-й день, 2-я минута 2019 года или 6 января 2019 года в 00:02:00 (значение времени впоследствии переопределяет это, поскольку оно анализируется позже).

Если вы хотели, чтобы эти даты интерпретировались как 6 февраля, используйте заглавную M в строке формата времени.Если вы хотели, чтобы эти даты были интерпретированы как 2 июня, то также транспонируйте d s и M s.

0 голосов
/ 01 апреля 2019

Вы можете использовать udf для анализа даты, как показано ниже:

from datetime import datetime

raw_data_10_sites = raw_data_10_sites.withColumn('date_col',
F.udf(lambda d: datetime.strptime(d, '%d/%m/%Y %I:%M %p').strftime('%d/%m/%Y %H:%M:%S'), T.StringType())(F.col('ReceivedDate')))

raw_data_10_sites.show()
...