当前位置: 首页 > 知识库问答 >
问题:

Pandas '.to_pydatetime()' 在 DataFrame 内不起作用

邢英奕
2023-03-14

我有像'03-21-2019'这样的字符串,我想将它们转换为本机Python datetime对象:即datetime.datetime类型。通过熊猫转换很容易:

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,这在本机Pythondatetime中定义得非常好。datetime类。但是,我的数据在一个<code>pd.DataFrame</code>中。当我尝试以下代码时:

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表达式的一部分(即string-to-pandas-Timestamp),而不是最后一部分(即pandas-Timestamp-to-datetime.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对象,但我看不到任何方法。这看起来像是熊猫中的一个错误,但我当然愿意将其视为我的用户错误。

为什么我不能获取本机日期时间。datetime对象来自熊猫。DataFrame是字符串还是列?

我看了这个帖子和这个帖子,但是他们都没有回答我的问题。

[编辑]:这里有一些更奇怪的事情:

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]))

在这里,我甚至没有使用熊猫来转换字符串,我仍然得到一个

<class 'pandas._libs.tslibs.timestamps.Timestamp'>

出来吧!

非常感谢您抽出宝贵时间接受采访!

[进一步编辑]:显然,在这个线程中,在Nehal J Wani的回答中,当您分配到<code>pd.DataFrame时,<code>pandas</code>会自动转换回其原始日期时间格式。这不是我想听到的,但显然,当我读出<code>pd.DataFrame

共有2个答案

章松
2023-03-14

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

1)如果您有一个静态datetime对象或一列(pandas)时间戳,并且您愿意处理一个Timedelta (pandas)的Pandas版本。_ libs . ts libs . time deltas . time delta ),可以在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) 如果您不关心数据帧,但愿意处理列表/numpy数组,则可以通过对序列而不是单个元素进行操作,将日期时间转换为python原生日期时间。下面,arr是一个numpy。日期时间的ndarray。datetime对象。您可以使用列表(arr)将其更改为常规的日期时间列表:

arr = df['Date'].dt.to_pydatetime()
齐英韶
2023-03-14

多亏了莎拉

arr_date = df['Date'].dt.to_pydatetime()
df['Date']= pd.Series(arr_date, dtype=object)

例子:

import pandas as pd
from datetime import datetime

df = pd.DataFrame({"date": [datetime(2021, 8, 28, 4, 10), datetime(2021, 8, 28, 4, 10)]})
df.dtypes

#   date    datetime64[ns]
#   dtype: object

arr_date = df["date"].dt.to_pydatetime()
df["date"] = pd.Series(arr_date, dtype="object")
df.dtypes

#   date    object
#   dtype: object

df.iloc[0,0]

# datetime.datetime(2021, 8, 28, 4, 10)
 类似资料:
  • 问题内容: 我的代码的目的是导入2个Excel文件,对其进行比较,然后将差异打印到新的Excel文件中。 但是,在连接所有数据并使用该功能之后,控制台将接受该代码。但是,当打印到新的excel文件时,重复副本仍会在当天保留。 我想念什么吗?是某种使功能无效的东西吗? 我的代码如下: 问题答案: 您已经拥有了,所以您没有进行修改。你想要 要么

  • 问题内容: 我创建了一个包含3列的数据框:zip,lat,lng 我想选择zip = 00650的经纬度值 因此,我尝试使用: 但是它返回ArrayOutOfBound异常,因为它没有任何值。如果我删除where子句,它将运行良好。 有人可以解释我在做什么错吗? 更新: 数据框架构: 前10行是: 问题答案: 正如你可以在你的方案看是类型的,所以你的查询应该是这样的 更新: 如果您正在使用,则可以

  • 问题内容: 将Pandas DataFrame写入CSV时,我需要索引从1开始而不是0。 这是一个例子: 产生以下输出: 但是我想要的输出是这样的: 我意识到可以通过在数据帧中添加一列以1为单位的整数序列来完成此操作,但是我对Pandas并不陌生,我想知道是否存在更简洁的方法。 问题答案: 索引是一个对象,默认索引从开始: 您可以使用

  • 问题内容: 我已经进行了一些搜索,无法弄清楚如何通过过滤数据帧,但是我想知道是否有一种方法可以反向执行:通过该集合的补充来过滤数据帧。例如:达到的效果。 可以通过一种方法来完成吗? 问题答案: 您可以使用invert(〜)运算符(其作用类似于非布尔数据): ,RHS返回的副本在哪里。 包含还接受正则表达式… 如果以上方法引发ValueError,则可能是由于您混合使用了数据类型,所以请使用: 要么

  • 我也在遵循Spark1.3文档。https://spark.apache.org/docs/latest/sql-programming-guide.html#推断-the-schema-using-reflection有一个解决方案吗? 下面是我的测试代码。

  • 我试图从一个简单的熊猫数据流创建一个火花数据流。这是我遵循的步骤。 在这之前一切都好。输出为: Spark UI 版本:V2.4.0 主人:本地[*]