如果需要测试时间,则默认情况下,大熊猫会使用今天的日期,因此可能的解决方案是,如果所有列值都匹配,则用Series.dt.date
,Timestamp.date
和Series.all
对其进行测试。
还为测试日期添加了另一种解决方案-测试Series.dt.floor
删除时间后是否具有相同的值:
df = pd.DataFrame({'a':['2019-01-01 12:23:10','2019-01-02 12:23:10'],'b':['2019-01-01','2019-01-02'],'c':['12:23:10','15:23:10'],'d':['a','b']})
print (df)
a b c d
0 2019-01-01 12:23:10 2019-01-01 12:23:10 a
1 2019-01-02 12:23:10 2019-01-02 15:23:10 b
def check(col):
try:
dt = pd.to_datetime(df[col])
if (dt.dt.floor('d') == dt).all():
return ('Its a pure date field')
elif (dt.dt.date == pd.Timestamp('now').date()).all():
return ('Its a pure time field')
else:
return ('Its a Datetime field')
except:
return ('its not a datefield')
print (check('a'))
print (check('b'))
print (check('c'))
print (check('d'))
Its a Datetime field
Its a pure date field
Its a pure time field
its not a datefield
另一个想法是测试数值列是否默认情况下不返回数值,以防止将数值强制转换为日期时间,但是如果可能的话,所有日期时间仅包含今天的日期(f
列),则测试时间与{{ 3}}用于匹配模式HH:MM:SS
或H:MM:SS
:
df = pd.DataFrame({'a':['2019-01-01 12:23:10','b'],'e':[1,2],'f':['2019-11-13 12:23:10','2019-11-13'],})
print (df)
a b c d e f
0 2019-01-01 12:23:10 2019-01-01 12:23:10 a 1 2019-11-13 12:23:10
1 2019-01-02 2019-01-02 15:23:10 b 2 2019-11-13
def check(col):
if np.issubdtype(df[col].dtype,np.number):
return ('its not a datefield')
try:
dt = pd.to_datetime(df[col])
if (dt.dt.floor('d') == dt).all():
return ('Its a pure date field')
elif df[col].str.contains(r"^\d{1,2}:\d{2}:\d{2}$").all():
return ('Its a pure time field')
else:
return ('Its a Datetime field')
except:
return ('its not a datefield')
print (check('a'))
print (check('b'))
print (check('c'))
print (check('d'))
print (check('e'))
print (check('f'))
Its a Datetime field
Its a pure date field
Its a pure time field
its not a datefield
its not a datefield
Its a Datetime field
本文链接:https://www.f2er.com/3112215.html