【问题标题】:Filter out Dataframe for Preset Date and Time过滤出预设日期和时间的数据框
【发布时间】:2020-09-02 01:19:38
【问题描述】:

我的 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'

【问题讨论】:

  • 为什么不将pandas列转换为datetime格式并进行比较呢?这个link 提供了一篇关于比较日期时间的好帖子。

标签: python pandas dataframe


【解决方案1】:

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

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

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

【讨论】:

  • df['from'] = pd.to_datetime(df['From Date'] + ' ' + df['From Time'])
  • 文件 ".\tts2.py",第 10 行,在 中 df['from'] = pd.to_datetime(df['From Date'] + ' ' + df['From时间']) 类型错误:+ 的不支持的操作数类型:'DatetimeArray' 和 'str'
  • 你能发帖df.dtypes吗?并尝试添加.astype(str) 的版本,查看我的更新答案
  • 日期类型:datetime64[ns]
  • 好的,所以试试我上面贴的.astype(str)的更新版本
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 2019-01-15
  • 2018-05-03
  • 2022-11-23
  • 1970-01-01
  • 2022-09-23
  • 2021-09-04
  • 1970-01-01
相关资源
最近更新 更多