我正在尝试将数据帧导出到 Parquet 文件,稍后该文件将在管道中被非 Python 或 Pandas 的内容使用。 (Azure 数据工厂)
当我稍后在流程中提取 Parquet 文件时,它无法识别
datetime64[ns]
。 我宁愿只使用“vanilla”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()
方法在
export上指定列数据类型的选项。
有没有办法在 Pandas 数据框中创建普通的 Python
datetime.datetime
列(而不是 Numpy/Pandas datetime65[ns]
列)?
使用
dtype='object'
时尝试强制to_pydatetime
:
df['ts'] = pd.Series(df.timestamp.dt.to_pydatetime(),dtype='object')
df.loc[0,'ts']
输出:
datetime.datetime(2021, 2, 19, 15, 7, 24, 719272)
就我而言,当我尝试将
datetime64[ns]
转换为 datetime
时,我使用了函数 dt.date
并获得了对象数据,而不是精确的日期数据,但它有效:
df
[added_column_name] = pd.to_datetime(df['column_name']).dt.date
dfhead()
现在,“added_column_name”是一个对象数据。