Python:TypeError:dtype = datetime64 [ns]与日期之间的无效比较

时间:2020-05-18 08:50:08

标签: python pandas datetime

对于当前项目,我计划通过运行多个循环来按时间范围过滤JSON文件,每次循环的范围都略有偏移。但是,以下代码在第TypeError: Invalid comparison between dtype=datetime64[ns] and date行产生了错误after_start_date = df["Date"] >= start_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)

3 个答案:

答案 0 :(得分:3)

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

我希望这会有所帮助!

答案 1 :(得分:1)

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

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

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

代码中的其他怪异之处是:

  • 您编写了一个循环访问行for i in df.iterrows():的循环, 但切勿使用i(此循环的控制变量)。
  • 您的循环更适合在时间步长(而非“逐行”)模式下进行, 因此您的循环应类似于“ while end_date <= last_end_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

答案 2 :(得分:0)

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

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