【问题标题】:Python: TypeError: Invalid comparison between dtype=datetime64[ns] and datePython:TypeError:dtype = datetime64 [ns]和日期之间的无效比较
【发布时间】:2020-09-04 00:39:12
【问题描述】:

对于当前项目,我计划通过运行多个循环按时间范围过滤 JSON 文件,每次循环的范围都略有变化。但是,下面的代码会为行 after_start_date = df["Date"] >= start_date 产生错误 TypeError: Invalid comparison between dtype=datetime64[ns] and date

我已经尝试在 Python 代码以及相应的 JSON 文件中修改日期的格式。是否有任何巧妙的调整来对齐日期类型/格式?

JSON 文件格式如下:

[
{"No":"121","Stock Symbol":"A","Date":"05/11/2017","Text Main":"Sample text"}
]

而对应的代码如下:

import string
import json

import pandas as pd
import datetime
from dateutil.relativedelta import *


# Loading and reading dataset
file = open("Glassdoor_A.json", "r")
data = json.load(file)
df = pd.json_normalize(data)
df['Date'] = pd.to_datetime(df['Date'])


# Create an empty dictionary
d = dict()

# Filtering by date

start_date = datetime.date.fromisoformat('2017-01-01')
end_date = datetime.date.fromisoformat('2017-01-31')

for i in df.iterrows():
    start_date += relativedelta(months=+3)
    end_date += relativedelta(months=+3)

    print(start_date)
    print(end_date)

    after_start_date = df["Date"] >= start_date
    before_end_date = df["Date"] <= end_date

    between_two_dates = after_start_date & before_end_date
    filtered_dates = df.loc[between_two_dates]

    print(filtered_dates)

【问题讨论】:

  • 您可以删除“日期”,即datetime.fromisoformat('...')

标签: python pandas datetime


【解决方案1】:

您可以使用pd.to_datetime('2017-01-31') 代替datetime.date.fromisoformat('2017-01-31')

我希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我的一般建议是不要使用 datetime 模块。 使用相当内置的 pandasonic 方法/类,例如 pd.to_datetimepd.DateOffset.

    您还应该在不需要时尽早关闭输入文件,例如:

    with open('Glassdoor_A.json', 'r') as file:
        data = json.load(file)
    

    您的代码中的其他奇怪点是:

    • 你写了一个循环遍历行for i in df.iterrows():, 但永远不要使用i(此循环的控制变量)。
    • 您的循环在 时间步长(不是“逐行”)模式下工作, 所以你的循环应该类似于“while end_date
    • start_dateend_date 的区别只是 1 个月(实际上是某个月的开始日期和结束日期), 但在循环中,您将两个日期都增加了 3 个月。

    下面是一个查找连续月份行的代码示例, 直到某个最终日期并打印当前月份的行(如果有):

    start_date = pd.to_datetime('2017-01-01')
    end_date = pd.to_datetime('2017-03-31')
    last_end_date = pd.to_datetime('2017-12-31')
    mnthBeg = pd.offsets.MonthBegin(3)
    mnthEnd = pd.offsets.MonthEnd(3)
    while end_date <= last_end_date:
        filtered_rows = df[df.Date.between(start_date, end_date)]
        n = len(filtered_rows.index)
        print(f'Date range: {start_date.strftime("%Y-%m-%d")} - {end_date.strftime("%Y-%m-%d")},  {n} rows.')
        if n > 0:
            print(filtered_rows)
        start_date += mnthBeg
        end_date += mnthEnd
    

    【讨论】:

    • 感谢您的输入,我目前正在尝试将其调整为 filtered_dates 输出,这是代码的进一步部分的基础。一个月的差是一个转录错误,“开始”end_date 应该是 31/03/2017。
    • 所以我更正了 end_date 的初始设置以及两个时间偏移到 3 个月。
    • “我的一般建议是不要使用 datetime 模块” 这应该放在上下文中 - 如果您主要使用 pandas 数据结构
    • 当然。您的问题只是在处理 Pandas 对象时出现错误,所以我认为这很明显。
    【解决方案3】:

    您可以使用以下方法比较您的日期

    from datetime import datetime
    df_subset = df.loc[(df['Start_Date'] > datetime.strptime('2018-12-31', '%Y-%m-%d'))]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2023-01-09
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      相关资源
      最近更新 更多