【发布时间】:2021-05-22 13:22:26
【问题描述】:
需要
我正在尝试将数据帧导出到 Parquet 文件,稍后将在管道中由非 Python 或 Pandas 的东西使用。 (Azure 数据工厂)
当我稍后在流程中提取 Parquet 文件时,它无法识别 datetime64[ns]。我宁愿只使用“香草”Python datetime.datetime。
问题
但我无法做到这一点。问题是 Pandas 将任何“类似日期时间的对象强制转换为datetime64[ns]”,一旦它返回到数据框或系列中。
小例子
例如,假设 iris 数据集具有 "timestamp" 列:
>>> df.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) class timestamp
0 5.1 3.5 1.4 0.2 setosa 2021-02-19 15:07:24.719272
1 4.9 3.0 1.4 0.2 setosa 2021-02-19 15:07:24.719272
2 4.7 3.2 1.3 0.2 setosa 2021-02-19 15:07:24.719272
3 4.6 3.1 1.5 0.2 setosa 2021-02-19 15:07:24.719272
4 5.0 3.6 1.4 0.2 setosa 2021-02-19 15:07:24.719272
>>> df.dtypes
sepal length (cm) float64
sepal width (cm) float64
petal length (cm) float64
petal width (cm) float64
class category
timestamp datetime64[ns]
dtype: object
我可以将值转换为“正常的 Python 日期时间”:
>>> df.timestamp[1]
Timestamp('2021-02-19 15:07:24.719272')
>>> type(df.timestamp[1])
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
>>> df.timestamp[1].to_pydatetime()
datetime.datetime(2021, 2, 19, 15, 7, 24, 719272)
>>> type(df.timestamp[1].to_pydatetime())
<class 'datetime.datetime'>
但是当我转换整个列/系列时,我不能将它“保留”在那种类型中:
>>> df['ts2'] = df.timestamp.apply(lambda x: x.to_pydatetime())
>>> df.dtypes
sepal length (cm) float64
sepal width (cm) float64
petal length (cm) float64
petal width (cm) float64
class category
timestamp datetime64[ns]
ts2 datetime64[ns]
可能的解决方案
我查看了是否可以采取任何措施来“简化”数据框列并使其日期时间不那么精确。但我什么也看不见。我也看不到通过df.to_parquet() 方法在导出 时指定列数据类型的选项。
有没有办法在 Pandas 数据框中创建一个普通的 Python datetime.datetime 列(不是 Numpy/Pandas datetime65[ns] 列)?
【问题讨论】:
-
或者尝试干预类和继承
-
在python中查找super()函数
-
只是好奇为什么你会希望 Python 的日期时间在数据框中,因为它与 Pandas 的配合不太好,将系列变成对象。
-
当您在
pandas中工作时,您需要保留 datetime64 dtype。如果我没记错的话,我之前在这里看到过类似的问题,我认为没有选项可以强制将 datetime.datetime 列导出到镶木地板。也许使用 ISO 格式字符串是一种选择?当然,您在另一边使用的工具将不得不再次解析为某个日期/时间 dtype 我猜... -
@QuangHoang,我需要
datetime只是因为 numpy/pandas 之外的工具很少——特别是我的工具 Azure 数据工厂——了解datetime64[ns]格式。当然,虽然还在 Python 中,但我喜欢这种格式,而且我对它很好。但这个脚本只是 ELT 链的一部分。
标签: python pandas dataframe datetime