熊猫验证日期格式

luk*_*s_o 3 python datetime pandas

有没有什么好方法可以验证数据框列中的所有项目都有有效的日期格式?

我的日期格式是11-Aug-2010.

我看到了这个通用答案,其中:

try:
    datetime.datetime.strptime(date_text, '%Y-%m-%d')
except ValueError:
    raise ValueError("Incorrect data format, should be YYYY-MM-DD")
Run Code Online (Sandbox Code Playgroud)

来源:https://stackoverflow.com/a/16870699/1374488

但我认为在我的情况下这不好(有效).

我假设我必须首先将字符串修改为pandas日期,如下所述: 将字符串日期时间转换为pandas datetime

我是Python世界的新手,任何想法都赞赏.

cs9*_*s95 8

(从piRSquared的答案借来的格式)

if pd.to_datetime(df['date'], format='%d-%b-%Y', errors='coerce').notnull().all():
    # do something 
Run Code Online (Sandbox Code Playgroud)

这就是LYBL-"在你跳跃之前看"的方法.True假设所有日期字符串都有效,这将返回- 这意味着它们都被转换为实际pd.Timestamp对象.强制使用无效的日期字符串NaT,即相当于的日期时间NaN.

或者,

try:
    pd.to_datetime(df['date'], format='%d-%b-%Y', errors='raise')
    # do something
except ValueError:
    pass
Run Code Online (Sandbox Code Playgroud)

这是EAFP-"更容易请求宽恕而不是权限"方法,ValueError当遇到无效的日期字符串时会引发a .


piR*_*red 5

如果知道格式,则可以使用布尔切片

mask = pd.to_datetime(df.columns, format='%d-%b-%Y', errors='coerce').notna()
df.loc[:, mask]
Run Code Online (Sandbox Code Playgroud)

考虑数据框 df

df = pd.DataFrame(1, range(1), ['11-Aug-2010', 'August2010, I think', 1])
df

   11-Aug-2010  August2010, I think  1
0            1                    1  1
Run Code Online (Sandbox Code Playgroud)

我可以过滤

mask = pd.to_datetime(df.columns, format='%d-%b-%Y', errors='coerce').notna()
df.loc[:, mask]

   11-Aug-2010
0            1
Run Code Online (Sandbox Code Playgroud)