pandas - 将字符串转换为标识正确年份的确切日期
问题描述
我有这样的数据:
+---+------+
| id| col|
+---+------+
| 1|210927|
| 2|210928|
| 3|210929|
| 4|210930|
| 5|211001|
+---+------+
我想要如下输出:
+---+------+----------+
| id| col| t_date1|
+---+------+----------+
| 1|210927|27-09-2021|
| 2|210928|28-09-2021|
| 3|210929|29-09-2021|
| 4|210930|30-09-2021|
| 5|211001|01-10-2021|
+---+------+----------+
我能够使用它pandas
和strptime
. 下面是我的代码:
pDF= df.toPandas()
valuesList = pDF['col'].to_list()
modifiedList = list()
for i in valuesList:
... modifiedList.append(datetime.strptime(i, "%y%m%d").strftime('%d-%m-%Y'))
pDF['t_date1']=modifiedList
df = spark.createDataFrame(pDF)
现在,主要问题是我想avoid
使用pandas
,list
因为我要处理millions
甚至billions
是数据,而在大数据方面,pandas 会减慢这个过程。
我在 spark 中尝试了各种方法,例如unixtime
, to_date
,timestamp
格式我需要但没有运气,并且由于strptime
仅适用于字符串,因此我不能直接在列上使用它。我不愿意创建 UDF,因为它们也很慢。
主要问题是确定我无法在 spark 中完成的确切年份,但我希望仅使用 spark 来实现它。需要改变什么?我哪里错了?
解决方案
您是否使用了正确的格式?使用yyMMdd
andto_date
进行解析,dd-MM-yyyy
格式化 date_format
应该可以工作:
import pyspark.sql.functions as f
df.withColumn('t_date', f.date_format(f.to_date('col', 'yyMMdd'), 'dd-MM-yyyy')).show()
+---+------+----------+
| id| col| t_date|
+---+------+----------+
| 1|210927|27-09-2021|
| 2|210928|28-09-2021|
| 3|210929|29-09-2021|
| 4|210930|30-09-2021|
| 5|211001|01-10-2021|
+---+------+----------+
如果col
不是字符串类型,则先转换为字符串:
df.withColumn('t_date', f.date_format(f.to_date(f.col('col').cast('string'), 'yyMMdd'), 'dd-MM-yyyy')).show()
推荐阅读
- firebase - 解析服务器中的推送通知
- anaconda - 安装后anaconda目录和anaconda提示丢失,如何解决?
- php - cURL 将请求 php 发布到 spring
- amazon-web-services - 亚马逊 s3 存储桶的虚拟样式路径如何工作?
- ios - Swift App - 在后台刷新多个 ViewController
- html - R Markdown HTML 输出与 R Studio 输出不匹配
- c++ - 分配具有 2D 向量大小的变量的内存
- python - 使用 elasticsearch_dsl 的第一个查询很慢,但第二个查询很快
- python-3.x - Jupyter - 页面加载时自动运行单元格
- pyspark - 什么是火花中的死执行者(Pyspark)