python-3.x - Pandas `.to_pydatetime()` 在 DataFrame 中不起作用
问题描述
我有这样的字符串'03-21-2019'
,我想将其转换为本机 Python datetime 对象:即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 - 在本机 Pythondatetime.datetime
类中完美定义。但是,我的数据位于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
表达式被评估(即 string-to-pandas-Timestamp),而不是最后一部分(即 pandas -时间戳到日期时间。日期时间)。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]))
结果和以前一样。它肯定是函数的一部分,因为结果不再是字符串。但我想要本机 Pythondatetime.datetime
对象,但我看不到获得它的方法。这看起来像是 中的一个错误pandas
,但我当然愿意将其视为我的用户错误。
为什么我不能从字符串列中获取本机
datetime.datetime
对象?pandas.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]))
在这里我什至没有pandas
用来转换字符串,我仍然得到一个
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
出来吧!
非常感谢您的宝贵时间!
[进一步编辑]:显然,在这个线程中,在 Nehal J Wani 的回答中,pandas
当您分配到pd.DataFrame
. 这不是我想听到的,但显然,当我读出pd.DataFrame
.
解决方案
根据您的实际目标,您有几个没有直接提及的选项。
1) 如果您有一个静态日期时间对象或 (pandas) 时间戳列,并且您愿意处理 Timedelta ( pandas._libs.tslibs.timedeltas.Timedelta
) 的 Pandas 版本,则可以直接在 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-native 日期时间。下面,arr
是一个numpy.ndarray
对象datetime.datetime
。您可以使用以下命令将其更改为常规日期时间列表list(arr)
:
arr = df['Date'].dt.to_pydatetime()
推荐阅读
- javascript - 滑块中的图像重复
- java - 如何在 Android Studio 中正确使用 database.raw 查询?
- token - 如何在万事达卡网关支付(mpgs)中使用托管结账方式进行标记化
- android - RecyclerView.Adapter StateRestorationPolicy 是如何工作的?
- excel - 数据归一化范围和规模
- android - 如何按前一天的按钮,前一天的日历应该来?
- android - ViewModel:检查片段是恢复还是停止
- python - 验证性能可以从 MNIST 训练数据和测试数据输出吗?
- css - 为什么 bulma 会覆盖我的 vue3 组件 css?
- azure-databricks - 如何使用已发布管道的 PipelineParameter 通过 DatabricksStep 指定 databricks 笔记本小部件?