Python Pandas 检查字符串是不是只有“日期”或只有“时间”或“日期时间”
Posted
技术标签:
【中文标题】Python Pandas 检查字符串是不是只有“日期”或只有“时间”或“日期时间”【英文标题】:Python Pandas check that string is only "Date" or only "Time" or "Datetime"Python Pandas 检查字符串是否只有“日期”或只有“时间”或“日期时间” 【发布时间】:2020-03-08 22:41:57 【问题描述】:我正在使用 pandas 读取 csv
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
df = pd.read_csv(file)
现在我的业务需求是我想知道哪一列是纯日期字段,纯时间字段,还是完整的日期时间。对于特定列,我的代码是:
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
我的代码的问题是当只有时间字段时,pd.to_datetime 采用默认的今天日期,所以我无法将它与日期时间区分开来。有什么简单的解决办法吗?请帮我在上面的代码中填写“某事”
【问题讨论】:
请也添加一些数据,以便我们尝试重现您的问题。 我已经添加了样本数据@AKX 【参考方案1】:如果想要测试时间,pandas 默认使用今天的日期,因此可能的解决方案是使用 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
列)然后测试时间与Series.str.contains
不同匹配模式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
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"^\d1,2:\d2:\d2$").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
【讨论】:
感谢您的回答,它正在工作。我怀疑我的“日期时间”列是否包含今天的日期和一些时间,那么它会返回('它是一个纯时间字段')。我说的对吗?以上是关于Python Pandas 检查字符串是不是只有“日期”或只有“时间”或“日期时间”的主要内容,如果未能解决你的问题,请参考以下文章
python - pandas - 检查数据框中是不是存在日期
有效地检查 Python / numpy / pandas 中的任意对象是不是为 NaN?
如何检查单元格是不是在 Pandas 中具有特定字符 [重复]