【问题标题】:Pandas Error Handling - "day is out of range for month"Pandas 错误处理 - “日期超出月份范围”
【发布时间】:2021-08-15 04:08:39
【问题描述】:

我想知道如何处理和发现 pandas 中格式错误的数据。

我尝试将字符串转换为 pd 数据形式,但是, 中间某处的格式与预期的格式不符(我假设),弹出一条错误消息。

  1. 我想打印数据是什么
  2. 我想将其修复为可以继续前进的正确格式
  3. 我该如何处理这个问题?

我的代码如下。

def date_format(df):
    
    target = pd.to_datetime(df['Issue Date'])
    
    return target

错误信息是

----------------------------------- ---------------------------- TypeError Traceback(最近一次调用 最后的) ~/anaconda3/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py 在 objects_to_datetime64ns(数据,dayfirst,yearfirst,UTC,错误, require_iso8601, allow_object) 2053 尝试: -> 2054 个值,tz_parsed = conversion.datetime_to_datetime64(data) 2055 # 如果 tzaware,这些值代表 unix 时间戳,所以我们

pandas/_libs/tslibs/conversion.pyx 在 pandas._libs.tslibs.conversion.datetime_to_datetime64()

TypeError:无法识别的值类型:

在处理上述异常的过程中,又发生了一个异常:

ValueError Traceback(最近调用 最后)在 ----> 1 seg0=generateDb(csv,2017,1000000,0)

在 generateDb(csv, year, segment, 指数) 2 3 targetSeg0=segment_df(csv,segment,index) ----> 4 targetSeg0['发布日期']=date_format(targetSeg0) 5 targetSeg0=remove_etc(targetSeg0) 6 filter_date(targetSeg0,year)

日期格式(df) 1 定义日期格式(df): ----> 2 target = pd.to_datetime(df['Issue Date']) 3 返回目标

~/anaconda3/lib/python3.8/site-packages/pandas/core/tools/datetimes.py 在 to_datetime(arg, 错误, dayfirst, yearfirst, UTC, 格式, 准确, 单位,infer_datetime_format,原点,缓存) 第797章 第798章 --> 799 cache_array = _maybe_cache(arg, format, cache, convert_listlike) 如果不是 cache_array.empty,则为 800: 801 结果 = arg.map(cache_array)

~/anaconda3/lib/python3.8/site-packages/pandas/core/tools/datetimes.py 在 _maybe_cache(arg, 格式, 缓存, convert_listlike) 第168章 169 如果 len(unique_dates) 170 cache_dates = convert_listlike(unique_dates, 格式) 171 缓存数组=系列(缓存日期,索引=唯一日期) 172 返回缓存数组

~/anaconda3/lib/python3.8/site-packages/pandas/core/tools/datetimes.py 在 _convert_listlike_datetimes(arg, 格式, 名称, tz, 单位, 错误, infer_datetime_format、dayfirst、yearfirst、exact) 457 断言格式为无或 infer_datetime_format 第458章 --> 459 结果,tz_parsed = objects_to_datetime64ns( 460 参数, 第461章

~/anaconda3/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py 在 objects_to_datetime64ns(数据,dayfirst,yearfirst,UTC,错误, require_iso8601, allow_object) 2057 返回 values.view("i8"), tz_parsed 2058 除了 (ValueError, 类型错误): -> 2059 raise e 2060 2061 if tz_parsed is not None:

~/anaconda3/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py 在 objects_to_datetime64ns(数据,dayfirst,yearfirst,UTC,错误, require_iso8601, allow_object) 2042 2043 尝试: -> 2044 结果,tz_parsed = tslib.array_to_datetime( 2045 数据,2046 错误=错误,

pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas/_libs/tslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas/_libs/tslib.pyx 在 pandas._libs.tslib.array_to_datetime_object()

pandas/_libs/tslib.pyx 在 pandas._libs.tslib.array_to_datetime_object()

pandas/_libs/tslibs/parsing.pyx 在 pandas._libs.tslibs.parsing.parse_datetime_string()

pandas/_libs/tslibs/parsing.pyx 在 pandas._libs.tslibs.parsing._parse_delimited_date()

cpython.datetime.datetime_new()中的datetime.pxd

ValueError: day is out of range for month

我最终会按如下方式过滤数据。

def filter_date(df,year):
    booldf =  df['Issue Date'] >= pd.to_datetime(f"{year}-01-01")
    booldf2 = df['Issue Date'] <= pd.to_datetime(f"{year}-12-31")
    return df[
        (df['Issue Date'] >= pd.to_datetime(f"{year}-01-01")) & (df['Issue Date'] <= pd.to_datetime(f"{year}-12-31"))
    ]

示例数据形式如下。

由于以下错误数据而发生错误。 (第 51 个月不存在).. 我想这就是错误的来源。

【问题讨论】:

  • 请以代码形式提供数据样本(即pd.DataFrame({'Issue Date': [...]})
  • @rudolfovic 谢谢!我刚刚添加了示例数据表单
  • 使用:df = pd.DataFrame(["09/26/2016", "06/14/2017", "09/05/2018", "06/16/2017", " 05/09/2018"], columns=['date']) 它工作正常: pd.to_datetime(df.date) 输出一个数据框,其日期为 datetime64 列。请提供一个它不起作用的例子(用准确的代码来重现它)。谢谢
  • @n4321d 发生错误的地方是数据格式有异常的数据格式。整理数据框时可以排除虚假数据吗?例如,当我这样做时, target = pd.to_datetime(df['Issue Date']) "如果某些字符串看起来不正确,请将其排除并返回一个数据框。"

标签: pandas dataframe


【解决方案1】:

根据您的 cmets,我认为这会有所帮助:

以示例为例(99/99/9999 是不正确的数据):

df = pd.DataFrame(["09/26/2016", "06/14/2017", "09/05/2018", "06/16/2017", "05/09/2018", "99/99/9999"], columns=['Issue Date']).

你的意思是这样的:

pd.to_datetime(df["Issue Date"], errors="coerce")

输出:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html

如果您想删除带有 NaT 的行,请使用:

df = df.dropna(axis=0, subset=['Issue Date'])

【讨论】:

  • 非常感谢!这似乎正是我想知道的。
  • 欢迎。请注意,dropna 也会删除带有其他 NaN 的行,您可以使用子集来定义仅使用 Issue date 列。我编辑了我的答案
猜你喜欢
  • 2023-03-12
  • 2017-07-29
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多