我有像'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
根据你的实际目标,你有几个没有直接提到的选项。
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()
多亏了莎拉
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 主人:本地[*]