如何防止Pandas将日期时间转换为datetime64

问题描述 投票:0回答:2

需要

我正在尝试将数据帧导出到 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]
列)?

python pandas dataframe datetime
2个回答
2
投票

使用

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)

0
投票

就我而言,当我尝试将

datetime64[ns]
转换为
datetime
时,我使用了函数
dt.date
并获得了对象数据,而不是精确的日期数据,但它有效:

df

[added_column_name] = pd.to_datetime(df['column_name']).dt.date
df
head()

现在,“added_column_name”是一个对象数据。

© www.soinside.com 2019 - 2024. All rights reserved.