Python检查字符串是否仅为";日期“;或者仅仅是;时间“;或;日期时间“;
我正在读一本关于熊猫的书Python检查字符串是否仅为";日期“;或者仅仅是;时间“;或;日期时间“;,python,pandas,numpy,csv,datetime,Python,Pandas,Numpy,Csv,Datetime,我正在读一本关于熊猫的书 str,date,float,time,datetime a,10/11/19,1.1,10:30:00,10/11/19 10:30 b,10/11/19,1.2,10:00:00,10/11/19 10:30 c,10/11/19,1.3,11:10:11,10/11/19 10:30 现在,我的业务需求是,我想告诉哪一列是纯日期字段、纯时间字段,或者哪一列是完全日期时间。对于特定列,我的代码是: try: dt = pd.
str,date,float,time,datetime
a,10/11/19,1.1,10:30:00,10/11/19 10:30
b,10/11/19,1.2,10:00:00,10/11/19 10:30
c,10/11/19,1.3,11:10:11,10/11/19 10:30
现在,我的业务需求是,我想告诉哪一列是纯日期字段、纯时间字段,或者哪一列是完全日期时间。对于特定列,我的代码是:
try:
dt = pd.to_datetime(df[col])
dates = [obj.date() for obj in dt]
times = [obj.time() for obj in dt]
if dates and (set(times) == set([datetime.time(0, 0)])):
# Its a pure date field
elif <something>:
# Its a pure time field
else:
#Its a Datetime field
except:
# its not a datefield
试试看:
dt=pd.to_日期时间(df[col])
日期=[obj.date()用于dt中的obj]
时间=[obj.time()表示对象在dt中]
如果日期和(设置(时间)=设置([datetime.time(0,0)]):
#这是一个纯日期字段
埃利夫:
#这是一个纯粹的时间场
其他:
#这是一个日期时间字段
除:
#它不是日期字段
我的代码的问题是,当只有时间字段时,pd.to_datetime采用默认的今天日期,所以我无法将其与datetime区分开来。有什么简单的解决办法吗?请帮助我在上面的代码中填写“某物”如果想要测试时间,熊猫默认使用今天的日期,所以可能的解决方案是使用测试它们,并且如果列的所有值都匹配 还为测试日期添加了另一种解决方案-通过以下方式在删除时间后测试相同值:
另一个想法是测试数字列是否默认返回非数字,以防止将数字转换为日期时间,但如果可能,所有日期时间仅包含今天的日期(
f
列),则时间测试与匹配模式不同HH:MM:SS
或H:MM:SS
:
df = pd.DataFrame({'a':['2019-01-01 12:23:10',
'2019-01-02'],
'b':['2019-01-01',
'2019-01-02'],
'c':['12:23:10',
'15:23:10'],
'd':['a','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
请也添加一些数据,以便我们可以尝试重现您的问题。我已经为ans添加了样本数据@AKXThanks,它正在工作。我的疑问是,如果我的“datetime”列包含今天的日期和某个时间,那么它是否会返回(“这是一个纯时间字段”)。我说得对吗?
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
df = pd.DataFrame({'a':['2019-01-01 12:23:10',
'2019-01-02'],
'b':['2019-01-01',
'2019-01-02'],
'c':['12:23:10',
'15:23:10'],
'd':['a','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