使用 Spark 3.1,我正在嘗試將字串型別值(“MM/dd/yyyy”)轉換為日期格式(“dd-MM-yyyy”)。我的檔案中共有 5 個日期列,我想將它們從 ("MM/dd/yy") 更改為正確的日期格式 ("dd-MM-yy")。這些列中有一些值已經采用日期格式,例如 05-02-2022(“dd-MM-YYYY”),還有一些值采用 10/23/2021(“MM-dd-yyyy”)格式。我只想將“MM-dd-YYYY”格式的值轉換為“dd-MM-yyyy”格式。我怎樣才能做到這一點?
輸入:
df = pd.DataFrame([[10/23/2019, 09/13/2021], [06/16/2020, 03/16/2021], [09/06/2022, 12/23/2019], columns=['A', 'B'])
輸出將類似于 23-10-2019、13-09-2021
我的代碼:
df = df.withColumn('date_col', to_date('Date_col', 'dd-MM-yy'))
代碼運行良好,但在日期列的輸出中回傳未定義。由于我有 5 個日期列,是否可以使用for回圈來完成?
uj5u.com熱心網友回復:
to_date 將列更改為日期型別,因此您需要指定字串的格式,而不是目標格式。您應該使用 date_format 函式,該函式最終將日期列更改為另一種格式的另一個字串。
將日期/時間戳/字串轉換為字串值,其格式由第二個引數給出的日期格式指定。
df.select(date_format(to_date(df.t, 'MM/dd/yyyy'), "dd-MM-yyyy").alias('date')).show()
如果您只有 5 列可以更改為日期型別并且此數字不會動態更改,我建議您這樣做:
df.withColumn("col1", date_format(to_date("dt1", MM/dd/yyyy'), "dd-MM-yyyy"))
.withColumn("col2", date_format(to_date("dt2", MM/dd/yyyy'), "dd-MM-yyyy"))
.withColumn("col3", date_format(to_date("dt3", MM/dd/yyyy'), "dd-MM-yyyy"))
.withColumn("col4", date_format(to_date("dt4", MM/dd/yyyy'), "dd-MM-yyyy"))
.withColumn("col5", date_format(to_date("dt5", MM/dd/yyyy'), "dd-MM-yyyy"))
uj5u.com熱心網友回復:
這是我的 2 美分
創建了一個包含 2 列的資料框(您可以根據需要創建任意數量的列)
df = spark.createDataFrame([('05/22/2022','10/21/2022')],schema=['Date_col1','Date_col2'])使用 to_date() 后跟 date_format()
from pyspark.sql.functions import * df1 = df.withColumn('date_col1',date_format(to_date(col("Date_col1"),"MM/dd/yyyy"),'dd-MM-yyyy'))\ .withColumn('date_col2',date_format(to_date(col("Date_col2"),"MM/dd/yyyy"),'dd-MM-yyyy'))\列印資料框
df1.show()
請檢查下圖:

uj5u.com熱心網友回復:
示例輸入 df(所有列均為字串日期型別):
from pyspark.sql import functions as F
df = spark.createDataFrame(
[('x', '01/31/2021', '12/31/2020'),
('y', '1/1/2020', '1/18/2020'),
('z', '15-01-2020', '20-10-2020')],
['id', 'c1', 'c2'])
以下將每一列轉換為日期型別:
for c in ['c1', 'c2']:
df = df.withColumn(
c,
F.when(F.col(c).rlike('\d{1,2}/\d{1,2}/\d{4}'), F.to_date(c, 'M/d/yyyy'))
.when(F.col(c).rlike('\d{1,2}-\d{1,2}-\d{4}'), F.to_date(c, 'd-M-yyyy'))
)
df.show()
# --- ---------- ----------
# | id| c1| c2|
# --- ---------- ----------
# | x|2021-01-31|2020-12-31|
# | y|2020-01-01|2020-01-18|
# | z|2020-01-15|2020-10-20|
# --- ---------- ----------
rlike方法檢查字串是否符合特定的正則運算式模式,如果符合,則when條件應用一個函式。
\d{1,2}/\d{1,2}/\d{4}檢查格式M/d/yyyy
\d{1,2}-\d{1,2}-\d{4}檢查格式d-M-yyyy
如果您有其他格式,您將得到null。為了不為空,您還需要在此函式中包含其他格式。
Spark 不支持以其他方式格式化的日期yyyy-MM-dd型別,除了. 如果您需要其他格式,則需要再次將日期型別轉換為字串型別,但使用您需要的格式:
for c in ['c1', 'c2']:
df = df.withColumn(
c,
F.date_format(
F.when(F.col(c).rlike('\d{1,2}/\d{1,2}/\d{4}'), F.to_date(c, 'M/d/yyyy'))
.when(F.col(c).rlike('\d{1,2}-\d{1,2}-\d{4}'), F.to_date(c, 'd-M-yyyy')),
"dd-MM-yyyy"
)
)
df.show()
# --- ---------- ----------
# | id| c1| c2|
# --- ---------- ----------
# | x|31-01-2021|31-12-2020|
# | y|01-01-2020|18-01-2020|
# | z|15-01-2020|20-10-2020|
# --- ---------- ----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/513087.html
上一篇:基于日期所需的Excel特定公式
