提取时间戳在特定范围内的 Python Pandas 记录[关闭]

Posted

技术标签:

【中文标题】提取时间戳在特定范围内的 Python Pandas 记录[关闭]【英文标题】:Extracting Python Pandas records where Timestamp is within specific range [closed] 【发布时间】:2020-11-30 15:56:19 【问题描述】:

我有一个数据框 df,其中一列存储处理时间(TimeStamp 对象)。

一个示例数据框:

from datetime import datetime, date
import pandas as pd

ids = ['WO_EW-1_10AUR-15-0031_00', 'IW-12_0400-15-0012_00', 'E-8_10AUR-18-0037_00']
dates = [date(2015,9,14), date(2015,9,17), date(2018,8,16)]
datetimes = [datetime(2015,9,14,13,23,40), datetime(2015,9,17,9,6,7), datetime(2018,8,16,7,32,6)]
datalist = list(zip(ids, dates, datetimes))

df = pd.DataFrame(datalist, columns=['ID', 'ProcessDate', 'ProcessingTime'])

我想要实现的是提取所有满足某个条件(或多个条件)的记录。在一种情况下,我想定位 'ProcessingTime' 属性具有小时值大于 13:10 的所有记录。 在上面的示例数据框中,在这种情况下所需的输出将是第一条记录。

将此类条件应用于数据框记录的正确方法是什么?


附: 我尝试使用以下方法,但均无效:

df.loc[ (df['ProcessTime'].time().hour > 14) ]

这会引发“AttributeError”,因为'Series' 对象没有属性'time'

df.loc[ (df['ProcessTime'] > datetime.time(14, 0, 0) ]

这会引发“TypeError”,因为 dtype=datetime64[ns] 和时间之间的比较无效

【问题讨论】:

这能回答你的问题吗? Select DataFrame rows between two dates 【参考方案1】: 问题是Boolean Indexing 没有使用pandas .dt accessor 正确执行 给定一个具有 datetime dtype 的列,可以使用 .dt. 后跟所需的方法(例如 pandas.Series.dt.time)访问 datetime 对象的组件 这里是Time/date components
import pandas as pd
from datetime import date, datetime, time

ids = ['WO_EW-1_10AUR-15-0031_00', 'IW-12_0400-15-0012_00', 'E-8_10AUR-18-0037_00']
dates = [date(2015,9,14), date(2015,9,17), date(2018,8,16)]
datetimes = [datetime(2015,9,14,13,23,40), datetime(2015,9,17,9,6,7), datetime(2018,8,16,7,32,6)]
datalist = list(zip(ids, dates, datetimes))

df = pd.DataFrame(datalist, columns=['ID', 'ProcessDate', 'ProcessingTime'])

# display(df)
                         ID ProcessDate      ProcessingTime
0  WO_EW-1_10AUR-15-0031_00  2015-09-14 2015-09-14 13:23:40
1     IW-12_0400-15-0012_00  2015-09-17 2015-09-17 09:06:07
2      E-8_10AUR-18-0037_00  2018-08-16 2018-08-16 07:32:06

# single condition
df[df.ProcessingTime.dt.hour > 7]

[out]:
                         ID ProcessDate      ProcessingTime
0  WO_EW-1_10AUR-15-0031_00  2015-09-14 2015-09-14 13:23:40
1     IW-12_0400-15-0012_00  2015-09-17 2015-09-17 09:06:07

# multiple conditions
df[(df.ProcessingTime.dt.hour > 7) & (df.ProcessingTime.dt.minute > 10)]

[out]:
                         ID ProcessDate      ProcessingTime
0  WO_EW-1_10AUR-15-0031_00  2015-09-14 2015-09-14 13:23:40

# an entire datetime
df[df.ProcessingTime < '2015-09-17 09:06:07']

[out]:
                         ID ProcessDate      ProcessingTime
0  WO_EW-1_10AUR-15-0031_00  2015-09-14 2015-09-14 13:23:40

# using .time
df[df.ProcessingTime.dt.time > time.fromisoformat('07:32:06')]

[out]:
                         ID ProcessDate      ProcessingTime
0  WO_EW-1_10AUR-15-0031_00  2015-09-14 2015-09-14 13:23:40
1     IW-12_0400-15-0012_00  2015-09-17 2015-09-17 09:06:07

【讨论】:

以上是关于提取时间戳在特定范围内的 Python Pandas 记录[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Python:返回特定范围内的矩阵值,范围以元组形式给出(从,到)

如何提取位于Sql中的范围内的数据

如何在 Python 中打印特定月份范围内的事务日志

在numpy数组Python中提取特定范围的列

Python - 删除范围之间的特定频率

Python帮助-如何从一维数组中提取特定范围的值? [重复]