Pandas 中的日期时间比较与 datetime.time() 混淆
Posted
技术标签:
【中文标题】Pandas 中的日期时间比较与 datetime.time() 混淆【英文标题】:Datetime comparison within Pandas messing with datetime.time() 【发布时间】:2017-01-07 14:30:14 【问题描述】:我有一个大型 Excel 文件,其中包含马拉松运动员的开始和结束时间。为了确定延迟开始时间后仍然在赛道上的跑步者数量,我尝试将数据导入 Pandas 并使用内置的 pandas 比较来返回在特定时间跑步的跑步者列表。在给定时间 x,赛道上的跑步者将有一个开始时间 x。然而,在 Pandas 中,其中一个给了我一个错误。
我使用 read_exel
从 Excel 导入数据框,它会自动将开始时间和结束时间转换为 Datetime.time
对象。这是一些示例数据
df = pd.DataFrame(
'name':['Bob','Sue','Joe'],
'start_time':[datetime.time(6,50,0),datetime.time(6,55,0),datetime.time(7,0,0)],
'start_time':[datetime.time(7,15,04),datetime.time(7,21,41),datetime.time(7,23,24)],)
跑步者从6:50
开始,我想每4
分钟列出一次赛道上的跑步者数量。所以我设置了一些变量来处理它:
race_start = datetime.datetime(100,1,1,6,50)
intervaul = datetime.timedelta(minutes = 4)
capture_time = race_start
然后我尝试使用 Pandas 内置的选择来选择正确的行
df[df.start_time <= capture_time.time() & df.end_time > capture_time.time()]
但是我得到了错误:
TypeError: 无法比较 datetime.time 和 unicode
事实上,df.start_time <= capture_time.time()
完全没问题并且可以运行,但是df.end_time <= capture_time.time()
返回这个错误。
我不知道这里发生了什么,如果有任何帮助,我们将不胜感激。
【问题讨论】:
【参考方案1】:您只需添加两次()
,第一次可以省略,但也可以使用最佳实践:
pd[(pd.start_time <= capture_time.time()) & (pd.end_time <= capture_time.time())]
或者可能end_time
列的dtype
不是datetime
,所以你可以使用to_datetime
:
pd.end_time = pandas.to_datetime(pd.end_time)
我认为DataFrame
的名称更好df
,那么你可以使用:
import pandas as pd
df.end_time = pd.to_datetime(df.end_time)
【讨论】:
我将编辑我的原始帖子以使其更清晰。在我匆忙中,我将我的数据框命名为 pd,而实际上我正在使用 df。不过我不认为这是问题所在。当我运行type(df.end_time[0])
时,我返回了 datetime.time。当我运行代码df[df.end_time > capture_time.time()]
时,我也得到相同的原始错误所以我不认为这是一个分组问题。
你能添加一些数据样本吗? 3 -4 行?
也许你可以使用df = pd.DataFrame('end_time':[datetime.time(10,11,10),datetime.time(11,10,23),datetime.time(12,12,4)], 'start_time':[datetime.time(10,11,7),datetime.time(11,10,20),datetime.time(12,12)],)
并根据需要进行更改。
已修复。感谢您帮助我度过难关!以上是关于Pandas 中的日期时间比较与 datetime.time() 混淆的主要内容,如果未能解决你的问题,请参考以下文章
pandas 中 datetime 和 datetime64[ns] 的比较
Python/Pandas/Datetime:将列中的整个列表转换为日期时间
pandas使用to_datetime函数将dataframe中的时间戳数据列(UNIX timestamp)转化为日期格式(datetime)数据列