gpt4 book ai didi

python-3.x - Pandas `.to_pydatetime()` 在 DataFrame 中不起作用

转载 作者:行者123 更新时间:2023-12-04 04:23:04 27 4
gpt4 key购买 nike

我有像 '03-21-2019' 这样的字符串我想转换为原生 Python 日期时间对象:即 datetime.datetime类型。通过 pandas 转换很容易:

import pandas as pd
import datetime as dt

date_str = '03-21-2019'
pd_Timestamp = pd.to_datetime(date_str)
py_datetime_object = pd_Timestamp.to_pydatetime()
print(type(py_datetime_object))

结果
<class 'datetime.datetime'>

这正是我想要的,因为我想计算 timedelta 's 通过从另一个中减去其中一个 - 在 native Python 中完美定义 datetime.datetime类(class)。但是,我的数据在 pd.DataFrame 中.当我尝试以下代码时:
import pandas as pd
import datetime as dt

df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(lambda x:
pd.to_datetime(x).to_pydatetime())
print(type(df['Date'].iloc[0]))

结果是
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

这是 错误 类型,我终生无法弄清楚为什么只有部分 lambda正在评估表达式(即字符串到 Pandas 时间戳),而不是最后一部分(即 Pandas 时间戳到日期时间.datetime)。如果我明确定义函数,而不是使用 lambda,它也不起作用。表达:
import pandas as pd
import datetime as dt


def to_native_datetime(date_str: str) -> dt.datetime:
return pd.to_datetime(date_str).to_pydatetime()


df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(to_native_datetime)
print(type(df['Date'].iloc[0]))

结果和之前一样。它肯定在执行函数的一部分,因为结果不再是字符串。但我想要原生 Python datetime.datetime对象,我认为没有办法得到它。这看起来像是 pandas 中的错误,但我当然愿意将其视为我的用户错误。

Why can't I get the native datetime.datetime object out of a pandas.DataFrame string column?



我看过 this threadthis one ,但他们都没有回答我的问题。

[编辑]:还有更奇怪的事情:
import pandas as pd
import datetime as dt


def to_native_datetime(date_str: str) -> dt.datetime:
return dt.datetime.strptime(date_str, '%m-%d-%Y')


df = pd.DataFrame(columns=['Date'])
df.loc[0] = ['03-21-2019']
df['Date'] = df['Date'].apply(to_native_datetime)
print(type(df['Date'].iloc[0]))

在这里我什至没有使用 pandas转换字符串,我 仍然 得到
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

出来吧!

非常感谢您的时间!

[进一步编辑]:显然,在 this thread , 在 Nehal J Wani 的回答中, pandas当您分配到 pd.DataFrame 时,它会自动转换回其原生日期时间格式.这不是我想听到的,但显然,当我读出 pd.DataFrame 时,我将不得不即时转换。 .

最佳答案

根据您的实际目标,您有几个没有直接提及的选项。

1)如果您有一个静态日期时间对象或一列(pandas)时间戳,并且您愿意处理 Timedelta 的 Pandas 版本( pandas._libs.tslibs.timedeltas.Timedelta ),则可以直接在 Pandas 中进行减法运算:

df = pd.DataFrame(columns=['Date'])
df.loc[0] = [pd.to_datetime('03-21-2019')]
df.loc[:, 'Offset'] = pd.Series([datetime.now()])
df.loc[:, 'Diff1'] = df['Offset'] - df['Date']
df.loc[:, 'Diff2'] = df['Date'] - datetime.now()

2) 如果您不关心 Dataframes,但愿意处理列表/numpy 数组,则可以通过对系列而不是单个元素进行操作,将日期时间转换为 Python 原生日期时间。下面, arrnumpy.ndarraydatetime.datetime对象。您可以使用 list(arr) 将其更改为常规日期时间列表:
arr = df['Date'].dt.to_pydatetime()

关于python-3.x - Pandas `.to_pydatetime()` 在 DataFrame 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58593741/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com