【问题标题】:converting string or Series type to time only with pandas仅使用 pandas 将字符串或系列类型转换为时间
【发布时间】:2018-08-09 18:41:46
【问题描述】:

我现在对类型很困惑。
我最近从 Rstudio 搬到了 python。
比方说

x = '20:05:20'
y = '20:06:10'

那么 x 和 y 只是字符串,即使它们引用时间。
为了只获取时间数据而不获取日期,我经常使用

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

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

datetime.time(20, 5, 20)

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

datetime.time(20, 6, 10)

但是,在我将 x 和 y 作为数据框后,此代码不再起作用。
如果你愿意,你可以试试。

ttmm=pd.DataFrame({'ttme':[x,y]})
ttmm['ttme']

0    20:05:20
1    20:06:10
Name: ttme, dtype: object

pd.to_datetime(ttmm['ttme'], format='%H:%M:%S').time()
然后我得到这个错误消息。

AttributeError: 'Series' object has no attribute 'time'

为什么这不起作用?

【问题讨论】:

  • 如果你想访问一个系列的日期时间属性,你可以使用.dt。为了只获取时间组件,请尝试:pd.to_datetime(ttmm['ttme'], format='%H:%M:%S').dt.time

标签: python pandas datetime


【解决方案1】:

首先让我们回答您的问题:执行pd.to_datetime(ttmm['ttme'], format='%H:%M:%S') 时,您将获得一个熊猫系列。如果你想对它应用一个函数,比如time(),你可能想这样做:

pd.to_datetime(ttmm['ttme'], format='%H:%M:%S').apply(lambda x: x.time())

现在只有两件小事:

  1. 也许是一个小错字? (ttme 而不是时间):

    ttmm=pd.DataFrame({'time':[x,y]})
    ttmm['time']
    
  2. 函数to_datetime 足够智能,可以在大多数情况下识别没有格式字符串的时间。不用也可以试试!

    pd.to_datetime(ttmm['ttme']).apply(lambda x: x.time())
    

【讨论】:

  • 谢谢!!它真的对我有帮助。太棒了!
【解决方案2】:

虽然两者都使用了相同的函数pd.to_datetime,但返回的类对象不同。 你可以尝试一下,然后你就明白了。

pd.to_datetime(x, format='%H:%M:%S')

返回:

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

如果你阅读源代码,pd.to_datetime函数返回DatetimeIndex对象,而DatetimeIndex对象有'时间'属性。

但是,pd.to_datetime(ttme['time'], format='%H:%M:%S') 函数返回:

<class 'pandas.core.series.Series>

Series 对象具有属性“dtypes/values/name...”但不包括“时间”。所以AttributeError: 'Series' object has no attribute 'time'这个消息是绝对正确的。

【讨论】:

  • 感谢您的解释!现在我想我知道的比以前少了。
猜你喜欢
  • 2019-04-27
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多