如何在pandas数据帧中有条件地检查和替换日期值?

时间:2017-10-25 14:40:39

标签: python pandas date dataframe timestamp

我正在使用Python 2.7和pandas,我有以下数据框:

    col1    col2    col3    date_col
0   123     0       foo     9999-12-31
1   456     1       bar     2017-09-15
2   789     1       psi     9999-12-31  

当我尝试使用此数据帧时,出现以下错误:

  

pandas._libs.tslibs.OutOfBoundsDattime:超出界限纳秒时间戳:9999-12-31 00:00:00

我知道这是因为pandas的时间戳窗口有限。

我的问题是:如何使用默认值替换超出日期窗口范围的date_col列中的所有值(例如2000-01-01)? 同样在我的真实数据框中,我只知道包含日期的列的索引,因此我不能使用列名。

感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

使用iloc按位置选择to_datetime和参数errors='coerce',以便将错误日期替换为NaT s,将fillna替换为{{3}}替换为{{ 1}}:

注意 - 如果dateint等错误数据全部替换为str

NaT

详情:

date = pd.Timestamp('2000-01-01')
df.iloc[:, 3] = pd.to_datetime(df.iloc[:, 3], errors='coerce').fillna(date)
print (df)
   col1  col2 col3   date_col
0   123     0  foo 2000-01-01
1   456     1  bar 2017-09-15
2   789     1  psi 2000-01-01

另一种解决方案:

print (df.iloc[:, 3])
0    9999-12-31
1    2017-09-15
2    9999-12-31
Name: date_col, dtype: object

print (pd.to_datetime(df.iloc[:, 3], errors='coerce'))
0          NaT
1   2017-09-15
2          NaT
Name: date_col, dtype: datetime64[ns]

答案 1 :(得分:0)

df = df.replace({想要替换日期的正则表达式},{date})

这应该有效

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html