使用 Pandas 将数据框中的 Python 对象列转换为没有日期的时间

Posted

技术标签:

【中文标题】使用 Pandas 将数据框中的 Python 对象列转换为没有日期的时间【英文标题】:Convert Python object column in dataframe to time without date using Pandas 【发布时间】:2017-05-17 18:35:53 【问题描述】:

我的数据框中有一列列出了HH:MM:SS 中的时间。当我在列上运行 dtype 时,它​​会出现dtype('o'),我希望能够将它用作x-axis 来绘制我的一些其他信号。我看到了以前关于使用to_datetime 的文档,并尝试使用它来将其转换为matplotlib 的可用时间格式。

使用的 pandas 版本是 0.18.1

我用过:

time=pd.to_datetime(df.Time,format='%H:%M:%S')

然后输出变成:

time
0       1900-01-01 00:00:01 

并针对列中的其余数据点执行。

即使我只指定了小时、分钟和秒,我仍然得到日期。这是为什么?我也试过了

time.hour()

只是为了提取小时部分,然后我收到一个错误,它没有“小时”属性。

非常感谢任何帮助!谢谢!

【问题讨论】:

能否分享示例数据 Python/Pandas convert string to time only的可能重复 【参考方案1】:

您可以像这样提取time 对象:

import pandas as pd

df = pd.DataFrame([['12:10:20']], columns="time": "item")
time = pd.to_datetime(df.time, format='%H:%M:%S').dt.time[0]

之后,您可以提取所需的属性:

hour = time.hour

(Source)

【讨论】:

给我更多错误 TypeError Traceback (最近一次调用最后) C:\Users\a421835\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\tseries\tools.py in _convert_listlike (参数、框、格式、名称) 408 try: --> 409 个值,tz = tslib.datetime_to_datetime64(arg) 410 返回 DatetimeIndex._simple_new(values, name=name, tz=tz) pandas\tslib.pyx in pandas.tslib .datetime_to_datetime64 (pandas\tslib.c:29768)() TypeError: Unrecognized value type: 在处理上述异常的过程中,又发生了一个异常:ValueError Traceback (最近一次调用最后一次) in () ----> 1 time= pd.to_datetime(df.Time,format='%H:%M').time() C:\Users\a421835\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\util\decorators.py在包装器中(*args,**kwargs) 我添加了示例数据以允许直接运行示例 好的,现在可以了。我只需要将您的 [0] 替换为 [:] 即可将其应用于整个列。谢谢你【参考方案2】:

现在是 2019 年,使用 pandas 0.25.0 和 Python 3.7.3。

(注意:已编辑答案以考虑绘图)

即使我只指定了小时、分钟和秒,我仍然得到日期。这是为什么呢?

根据pandas documentation 我认为这是因为在pandas Timestamp(相当于Datetime)对象中,参数年月日强制,而小时、分钟和秒是可选的。 因此,如果您在 Datetime 中转换您的对象类型对象,它必须具有年-月-日部分 - 如果您不指定,它将是默认的 1900-01-01。 p>

由于您的示例中还有一个日期列,因此您可以使用它来创建一个日期时间列,其中包含可用于绘制的正确日期:

import pandas as pd

df['Time'] = df.Date + " " + df.Time
df['Time'] = pd.to_datetime(df['Time'], format='%m/%d/%Y %H:%M:%S')

df.plot('Time', subplots=True)

这样,您的“时间”列将显示如下值:2016-07-25 01:12:07,其 dtype 为 datetime64[ns]。

话虽如此,如果您每天都在绘制,并且只想比较一天内的时间(而不是日期+时间),那么使用默认日期似乎并不麻烦,只要它在所有时间都是相同的日期 -时间将在同一天正确比较,无论是错误的。

在最不可能的情况下,您仍然需要一个仅限时间的列,this is the reverse operation:

import pandas as pd

df['Time-only'] = pd.to_datetime(df['Time'], format='%H:%M:%S').dt.time

如前所述,它没有日期(年-月-日),因此不能是日期时间对象,因此此列将采用对象格式

【讨论】:

是的,只要您有更多/新/正确的信息要提供,就可以编辑自己的答案。所以结论是,由于涉及绘图,它不是重复的。我建议我们删除这些不再需要的 cmets。

以上是关于使用 Pandas 将数据框中的 Python 对象列转换为没有日期的时间的主要内容,如果未能解决你的问题,请参考以下文章

python pandas用数字替换数据框中的字符串

将 JSON 时间戳字符串转换为 pandas 数据框中的 python 日期

Python Pandas 如何将 groupby 操作结果分配回父数据框中的列?

python将多个excel中的所有工作表附加到pandas数据框中的有效方法

对 pandas 数据框中的连续值进行分组

Python Pandas数据框中的行排序/计数