【问题标题】:Pandas: convert string to datetime.datetime熊猫:将字符串转换为 datetime.datetime
【发布时间】:2021-09-19 16:51:26
【问题描述】:

如何将datetimes 包含在pd.DataFrame 中?

import pandas as pd
from datetime import datetime

df = pd.DataFrame({"a": ['2002-02-02', '2002-02-03', '2002-02-04']})
df["b"] = df["a"].apply(lambda t: datetime.strptime(t, '%Y-%m-%d'))  # datetime.strptime returns datetime.datetime
print(datetime(2002, 2, 2) in df["b"])

输出False

同样,

f["c"] = df["b"].apply(lambda t: t.to_pydatetime())
print(datetime(2002, 2, 2) in df["c"])

输出False

请注意,thisthis 都不起作用。按照这些方法中的任何一种,我最终都会在数据框中得到Timestamps 而不是datetimes。

我正在使用 Python 3.8.5 和 Pandas 1.2.1。

【问题讨论】:

  • datetime(2002, 2, 2) in list(df['b'])?
  • @Epsi95 是的。但是,这意味着我每次都必须转换它。
  • @Epsi95 但是datetime(2002, 2, 2) in list(pd.to_datetime(df['b']).unique()) 又是False
  • datetime(2002, 2, 2) in list(pd.to_datetime(pd.to_datetime(df['b']).unique()))
  • 问题的标题让我很困惑;在pandas 中,您需要使用内置数据类型(numpy 中的 datetime64)。请注意,pandas 会自动将 Python 标准库日期时间转换为其内置数据类型。只有当你有一个 datetime.date 或 datetime.time 类型的 pd.Series 时,该类型才不会被修改。

标签: python pandas datetime type-conversion


【解决方案1】:

您可以看到,在您进行所有操作之后,所有系列的 datetime 对象在添加到数据帧时都会自动转换为时间戳:

>>> df
            a          b          c
0  2002-02-02 2002-02-02 2002-02-02
1  2002-02-03 2002-02-03 2002-02-03
2  2002-02-04 2002-02-04 2002-02-04
>>> df.dtypes
a            object
b    datetime64[ns]
c    datetime64[ns]
dtype: object

建议你使用 pandas 自带的 datetime 处理,绝对不会比 python datetime objects 难多少:

>>> pd.Timestamp(2002, 2, 2) in df['b'].to_list()
True
>>> df['b'].eq(pd.Timestamp(2002, 2, 2))
0     True
1    False
2    False
Name: b, dtype: bool
>>> df['b'].eq(pd.Timestamp(2002, 2, 2)).any()
True

此外,这为进一步处理日期和时间提供了丰富的可能性,而 Python datetime 对象无法做到这一点。

例如,您可以直接比较 str 而不是构建 Timestamp 对象:

>>> df['b'].eq('2002-02-02')
0     True
1    False
2    False
Name: b, dtype: bool

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2019-05-01
    • 2018-10-21
    • 2018-05-26
    • 2020-03-22
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多