繁体   English   中英

使用pd.read_csv时跳过包含错误日期的行

[英]skip rows with bad dates while using pd.read_csv

我正在使用pd.read_csv从外部数据源读取csv文件,如下面的代码所示:

pd.read_csv(
    BytesIO(raw_data),
    parse_dates=['dates'],
    date_parser=np.datetime64,
)

但是,在正在发送的csv中的某个位置,存在格式错误的日期,从而导致以下错误:

ValueError: Error parsing datetime string "2015-08-2" at position 8

这会导致整个应用程序崩溃。 当然,我可以通过try / except来处理这种情况,但之后我将丢失该特定csv中的所有其他数据。 我需要pandas来保存和解析其他数据。

我无法预测此数据(每日更改)何时/何处将具有格式错误的日期。 是否有一些方法可以让pd.read_csv只跳过日期不好的行但是仍然解析csv中的所有其他行?

在发送的csv的某个地方,有一个格式错误的日期

np.datetime64需要ISO8601格式的字符串才能正常工作。 好消息是你可以在自己的函数中包装np.datetime64并将其用作date_parser

def parse_date(v):
   try:
      return np.datetime64(v)
   except:
      # apply whatever remedies you deem appropriate
      pass
   return v

   pd.read_csv(
     ...
     date_parser=parse_date
   )

我需要pandas来保存和解析其他数据。

我经常发现像dateutil这样更灵活的日期解析器比np.datetime64工作得更好,甚至可以在没有额外功能的情况下工作:

import dateutil
pd.read_csv(
    BytesIO(raw_data),
    parse_dates=['dates'],
    date_parser=dateutil.parser.parse,
)

这是使用pd.convert_objects()方法执行此操作的另一种方法:

# make good and bad date csv files
# read in good dates file using parse_dates - no problem
df = pd.read_csv('dategood.csv', parse_dates=['dates'], date_parser=np.datetime64)

df.dtypes

dates    datetime64[ns]
data            float64
dtype: object

# try same code on bad dates file - throws exceptions
df = pd.read_csv('datebad.csv', parse_dates=['dates'], date_parser=np.datetime64)

ValueError: Error parsing datetime string "Q%Bte0tvk5" at position 0

# read the file first without converting dates
# then use convert objects to force conversion
df = pd.read_csv('datebad.csv')
df['cdate'] = df.dates.convert_objects(convert_dates='coerce')

# resulting new date column is a datetime64 same as good data file
df.dtype

dates            object
data            float64
cdate    datetime64[ns]
dtype: object

# the bad date has NaT in the cdate column - can clean it later
df.head()

        dates      data      cdate
0  2015-12-01  0.914836 2015-12-01
1  2015-12-02  0.866848 2015-12-02
2  2015-12-03  0.103718 2015-12-03
3  2015-12-04  0.514086 2015-12-04
4  Q%Bte0tvk5  0.583617        NaT

使用内置的pd.to_datetime ,它将非日期类型数据NaTNaT

pd.read_csv(
    BytesIO(raw_data),
    parse_dates=['dates'],
    date_parser=pd.to_datetime,
)

现在,您可以使用标准nan / null检查过滤掉无效行

df = df[~df["dates"].isnull()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM