我有一个 pyspark 数据框,我想将其转换为 pandas。
data= [
("A", 1, datetime(2023, 5, 19, 12, 1, 0)),
("B", 1, datetime(2023, 5, 19, 12, 1, 0)),
("C", 1, datetime(2023, 5, 19, 12, 1, 0)),
("D", 1, datetime(2023, 5, 19, 12, 5, 0)),
]
schema = StructType(
[
StructField('id_col', StringType(), True),
StructField('id2_col', IntegerType(), True),
StructField('timestamp', TimestampType(), True),
]
)
dfs = spark.createDataFrame(data=data, schema=schema)
dfp = dfs.toPandas()
当我这样做时,我收到一个错误:
TypeError: Casting to unit-less dtype 'datetime64' is not supported. Pass e.g. 'datetime64[ns]' instead.
如何解决这个问题?
最佳答案
您的代码适用于 PySpark 3.4.0
和 Pandas 1.5.3
,但不适用于 Pandas 2.0.2
。您可以降级 Pandas 版本,直到 PySpark 修复代码,或者您可以将 timestamp
列转换为字符串,然后再将其导出到 Pandas。
dfp = (dfs.withColumn('timestamp', dfs.timestamp.cast('string'))
.toPandas().astype({'timestamp': 'datetime64[ns]'}))
输出:
>>> dfp
id_col id2_col timestamp
0 A 1 2023-05-19 12:01:00
1 B 1 2023-05-19 12:01:00
2 C 1 2023-05-19 12:01:00
3 D 1 2023-05-19 12:05:00
>>> dfp.dtypes
id_col object
id2_col int32
timestamp datetime64[ns]
dtype: object
Pandas 的可重现错误:
# df = pd.DataFrame({'timestamp': ['2023-05-19 12:01:00']})
>>> df.astype({'timestamp': 'datetime64'})
...
TypeError: Casting to unit-less dtype 'datetime64' is not supported. Pass e.g. 'datetime64[ns]' instead.
>>> df.astype({'timestamp': 'datetime64[ns]'})
timestamp
0 2023-05-19 12:01:00
关于pandas - 将 pyspark 转换为 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76389694/