Python 从字符串PySpark获取年、月、日

Python 从字符串PySpark获取年、月、日,python,apache-spark,datetime,parsing,pyspark,Python,Apache Spark,Datetime,Parsing,Pyspark,我需要从Spark df中时间列中的字符串中获取年、月、日、小时。我还需要将这些值保存在单独的列中。数据如下所示: ID Time 111 2020-03-23-12:40:04 112 2020-04-23-12:40:04 113 2020-05-23-12:40:04 所需输出为: ID Year Month Day 111 2020

我需要从Spark df中
时间
列中的字符串中获取
年、月、日、小时
。我还需要将这些值保存在单独的列中。数据如下所示:

ID               Time
111            2020-03-23-12:40:04
112            2020-04-23-12:40:04
113            2020-05-23-12:40:04
所需输出为:

ID        Year        Month        Day
111     2020         03            23
112     2020         04            23
113     2020         05            23
我试过:

data_df.select(
    year("Time").alias('year'), 
    month("Time").alias('month'), 
    dayofmonth("Time").alias('day')
).show()

它返回了所有空值。

我假设
Time
列是一个字符串。您可以使用正则表达式提取所需的值,但这将非常痛苦。另一个选项是将字符串转换为时间戳,然后使用函数
year
month

此外,时间戳不是标准格式,因此需要指定它

data=[(111,'2020-03-23-12:40:04'),
(112, '2020-04-23-12:40:04'),
(113, '2020-05-23-12:40:04')]
df=spark.createDataFrame(数据,['ID','Time'])
df\
.withColumn('t',F.to_timestamp('Time','yyyy-MM-dd HH:MM:ss'))\
.选择('ID',
F.年份(“t”)。别名(“年份”),
F.月份('t')。别名('month'),
F.dayofmonth('t')。别名('day'),
F.hour('t')。别名('hour'))
).show()
这将产生:

+---+----+-----+---+----+
|ID |年|月|日|小时|
+---+----+-----+---+----+
|111|2020|    3| 23|  12|
|112|2020|    4| 23|  12|
|113|2020|    5| 23|  12|
+---+----+-----+---+----+

这是什么类型的数据?时间列?它是字符串还是时间戳?@werner您好,它是
StringType
。然后它将删除空值。您应该首先使用
来设置时间戳
来将字符串转换为时间戳。
等应该返回预期结果如果我只想解析它而不转换…需要一个udf函数,它比to_timestamp和date函数慢得多