将“ 06/02/2019 7:30 AM”时间戳解析为pyspark中的24Hr时钟时间戳
这是“我的数据框”的架构:
root
|-- Customer_Site_ID: string (nullable = true)
|-- ReceivedDate: string (nullable = true)
|-- BattV: double (nullable = true)
转换为24小时日期时间
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|
+-------------------+
这个月完全错误,有人可以帮忙吗? 我尝试了很多功能,但对我没有用。 我也浏览过许多博客,但是这个问题是独一无二的。我只是不知道怎么可能?
答案 0 :(得分:0)
您可以使用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()
答案 1 :(得分:0)
M on和 M 都以字母 M 开头,因此,为了明确时间格式,我们需要一种方法来告诉如果我们要使用速记,则将它们分开。
对于the to_timestamp
function,必须使用SimpleDateFormat对象的约定。在这种情况下,m
表示 minute ,而M
表示 Month 。
因此:当您将字符串"dd/mm/yyyy HH:mm a"
传递给to_timestamp
时,是在告诉它将字符串06/02/2019
解释为年份的第六天,2019年第二分钟或一月。 6,2019,00:02:00(之后的时间值将覆盖此值,因为稍后会对其进行解析)。
如果要将这些日期解释为2月6日,请在时间格式字符串中使用大写的Ms。如果您打算将这些日期解释为6月2日,则还要移置d
和M
。
答案 2 :(得分:0)
由于分钟和月份都以“ m”开头,因此格式区分大小写。对于分钟,保留小写字母“ m”,对于月保留大写字母“ M”。只需将格式编辑为“ dd / Mm / yyyy HH:mm a”
现在正在发生的情况是,格式两次声明分钟,并且第二个位置可能正在获得优先。月份完全缺少格式,因此默认情况下会估算01。