仅选择在特定时间出现的行

Posted

技术标签:

【中文标题】仅选择在特定时间出现的行【英文标题】:Select only rows that occur at specific time 【发布时间】:2017-10-13 16:06:21 【问题描述】:

我已经阅读了C.csv 并且datetime 列是object 类型。

无论日期如何,我都想获取其中包含 23:45:00 的每一行。我想将datetime 作为索引,我想将datetime 索引转换为 datetime64[ns]。我相信 pandas 是为这类事情设计的,但我的索引和数据类型混淆了。

    import datetime as dt
    import pandas as pd
    df = pd.read_csv('C.csv', index_col = 'datetime', parse_dates=['datetime'])

数据框:

                     C      H      L      O  OI  V    WAP
datetime                                                     
2017-04-22 09:23:00  39.48  39.48  39.48  39.48   0  0  39.48
2017-04-22 09:24:00  39.48  39.48  39.48  39.48   0  0  39.48
2017-04-22 09:25:00  39.48  39.48  39.48  39.48   0  0  39.48
2017-04-22 09:26:00  39.44  39.44  39.44  39.44   1  4  39.44
2017-04-22 09:27:00  39.48  39.48  39.48  39.48   3  2  39.48

【问题讨论】:

【参考方案1】:
print(df)
              datetime      C      H      L      O  OI  V    WAP
0  2017-04-22 09:23:00  39.48  39.48  39.48  39.48   0  0  39.48
1  2017-04-22 09:24:00  39.48  39.48  39.48  39.48   0  0  39.48
2  2017-04-22 09:25:00  39.48  39.48  39.48  39.48   0  0  39.48
3  2017-04-22 09:26:00  39.44  39.44  39.44  39.44   1  4  39.44
4  2017-04-22 09:27:00  39.48  39.48  39.48  39.48   3  2  39.48
5  2017-04-23 09:25:00  39.48  39.48  39.48  39.48   3  2  39.48

datetime 设为索引,并转换为日期时间dtype

df.set_index('datetime', inplace=True)
df.index = pd.to_datetime(df.index)

print(df.index.dtype)
dtype('<M8[ns]')

现在将匹配时间戳设置为所需时间并按匹配过滤:

match_timestamp = "09:25:00"
df.loc[df.index.strftime("%H:%M:%S") == match_timestamp]

                         C      H      L      O  OI  V    WAP
datetime                                                     
2017-04-22 09:25:00  39.48  39.48  39.48  39.48   0  0  39.48
2017-04-23 09:25:00  39.48  39.48  39.48  39.48   3  2  39.48

(时间戳23:45:00 未包含在您的示例数据中,但要匹配此时间,只需调整match_timestamp。)

【讨论】:

您将如何多次执行此操作?因此,要在 19.00 和 8.00 之间的所有日期范围内提取所有时间。我认为您不能只将 match_timestamp 列为列表。有没有更简单的方法来做到这一点,而不是通过 for 循环运行它并附加结果 @LukaVlaskalic 是的,您可以在没有 for 循环的情况下执行此操作,但是在评论中发布的代码有点过多。如果还没有在 SO 上得到回答,我会感到惊讶,但如果没有,请提出一个新问题,我很乐意带您完成它。 对于其他人来说,我最终使用了这个pandas.pydata.org/pandas-docs/version/0.23/generated/…

以上是关于仅选择在特定时间出现的行的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择所有或仅特定的行

从 SQL 数据库中选择特定的行和列

选择顶部的行,直到特定列中的值出现两次

如何从同一个表中选择特定单元格的行?

如何查询仅出现特定列中具有最高值的行的行?

如何使不满足特定条件的行不出现在结果中