【问题标题】:How to prevent Pandas from converting datetimes to datetime64如何防止 Pandas 将日期时间转换为 datetime64
【发布时间】: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


【解决方案1】:

当你使用to_pydatetime时,尝试强制dtype='object'

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]。但是你让我想到了最终的解决方案:只需将其强制为标准亚洲风格日期格式的字符串。那行得通。 :)
  • @MikeWilliamson 如输出所示。具有 object dtype 的 series 保留日期时间时间戳,即使您将其连接回数据帧(作为 ts 列)。我没有尝试覆盖原始列,但我很确定它的行为应该相同。
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 2023-03-17
  • 2020-11-06
  • 1970-01-01
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多