首页 > 解决方案 > 过滤出预设日期和时间的数据框

问题描述

我的 Excel 文件包含以下列

在此处输入图像描述

我需要按当前日期和时间过滤掉该行。意味着,它应该显示 Today 介于“From Date”和“To Date”之间的那些行

当前时间介于“从时间”和“到时间”之间

这是我的代码:

import pandas as pd
from datetime import datetime

today = (datetime.date(datetime.now())) ##For Date
print (today)
now = datetime.now()
now = now.strftime("%H:%M:%S")
print(now)

df = pd.read_excel (r'ymca.xlsx')

df = df[(df['From Date']<= str(today)) & (df['To Date']>= str(today))]
print (df)
df = df[(df['From Time']<= str(now)) & (df['To Time']>= str(now))]
print (df)

第一个过滤器工作正常,它能够过滤日期

2020-09-01
22:04:37
   From Date    To Date From Time   To Time
1 2020-08-31 2020-09-01  00:00:00  13:00:00
2 2020-09-01 2020-09-02  12:00:00  13:00:00
5 2020-08-31 2020-09-05  12:00:00  13:00:00

但是第二个时间过滤器不起作用。它出错了,因为两者的语法相同。

请帮忙。

  File ".\tts2.py", line 17, in <module>
    df = df[(df['From Time']<= str(now)) & (df['To Time']>= str(now))]
  File "C:\Python38\lib\site-packages\pandas\core\ops\common.py", line 64, in new_method
    return method(self, other)
  File "C:\Python38\lib\site-packages\pandas\core\ops\__init__.py", line 529, in wrapper
    res_values = comparison_op(lvalues, rvalues, op)
  File "C:\Python38\lib\site-packages\pandas\core\ops\array_ops.py", line 247, in comparison_op
    res_values = comp_method_OBJECT_ARRAY(op, lvalues, rvalues)
  File "C:\Python38\lib\site-packages\pandas\core\ops\array_ops.py", line 57, in comp_method_OBJECT_ARRAY
    result = libops.scalar_compare(x.ravel(), y, op)
  File "pandas\_libs\ops.pyx", line 96, in pandas._libs.ops.scalar_compare
TypeError: '<=' not supported between instances of 'datetime.time' and 'str'

标签: pythonpandasdataframe

解决方案


只需将单独的日期和时间列转换为from包含to日期时间的列,然后过滤这些列:

df['from'] = pd.to_datetime(df['From Date'].astype(str) + ' ' + df['From Time'])
df['to'] = pd.to_datetime(df['To Date'].astype(str) + ' ' + df['To Time'])

now = pd.to_datetime('now')
df.loc[(now >= df.pop('from')) & (now <= df.pop('to'))]

输出:

    From Date     To Date From Time   To Time
1  2020-09-01  2020-09-02  12:00:00  13:00:00
2  2020-08-31  2020-09-05  12:00:00  13:00:00

PS现在,要解释您遇到的错误,这是因为您的时间列似乎是datetime.time类型,不支持与字符串进行比较。


推荐阅读