python - pandas - 检查数据框中是不是存在日期
Posted
技术标签:
【中文标题】python - pandas - 检查数据框中是不是存在日期【英文标题】:python - pandas - check if date exists in dataframepython - pandas - 检查数据框中是否存在日期 【发布时间】:2017-02-15 01:07:30 【问题描述】:我有一个这样的数据框:
category date number
0 Cat1 2010-03-01 1
1 Cat2 2010-09-01 1
2 Cat3 2010-10-01 1
3 Cat4 2010-12-01 1
4 Cat5 2012-04-01 1
5 Cat2 2013-02-01 1
6 Cat3 2013-07-01 1
7 Cat4 2013-11-01 2
8 Cat5 2014-11-01 5
9 Cat2 2015-01-01 1
10 Cat3 2015-03-01 1
我想检查此数据框中是否存在日期,但我无法检查。我尝试了以下各种方法,但仍然没有用:
if pandas.Timestamp("2010-03-01 00:00:00", tz=None) in df['date'].values:
print 'date exist'
if datetime.strptime('2010-03-01', '%Y-%m-%d') in df['date'].values:
print 'date exist'
if '2010-03-01' in df['date'].values:
print 'date exist'
“日期存在”从未被打印出来。如何检查日期是否存在?因为我想在所有类别中插入数字等于 0 的不存在日期,以便我可以绘制连续折线图(每行一个类别)。帮助表示赞赏。提前致谢。
最后一个给了我这个:
FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison
并且date exist
不会被打印出来。
【问题讨论】:
df['date']
的dtype
是什么,很重要,你也可以只做(df['date'] == yourdate).any()
【参考方案1】:
我认为您需要先通过to_datetime
转换为日期时间,然后如果需要选择所有行使用boolean indexing
:
df.date = pd.to_datetime(df.date)
print (df.date == pd.Timestamp("2010-03-01 00:00:00"))
0 True
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
Name: date, dtype: bool
print (df[df.date == pd.Timestamp("2010-03-01 00:00:00")])
category date number
0 Cat1 2010-03-01 1
对于返回True
,使用values
转换为numpy array
的校验值:
if ('2010-03-01' in df['date'].values):
print ('date exist')
或至少一个True
any
作为评论Edchum:
if (df.date == pd.Timestamp("2010-03-01 00:00:00")).any():
print ('date exist')
【讨论】:
很好奇最后一个不起作用。除非这是额外空间或其他问题的问题。顺便说一句,您知道为什么在使用in
时必须在Series
上使用.values
吗?值和索引之间的歧义?
@juanpa.arrivillaga - 显然values
可以省略,我不知道它如何与日期时间一起使用。
好吧,在我的解释器 shell 中,如果我使用'2010-03-01' in df['date']
,我会得到False
,但如果我使用'2010-03-01' in df['date'].values
,我就会明白。
df.date = pd.to_datetime(df.date) if pd.Timestamp("2010-03-01 00:00:00") in df['date'].values: print 'date exist'
这个还是不行。我无法打印出“日期存在”。我需要进入 if 原因,因为如果该日期不存在,我需要将数据添加到数据框
有趣,在内部四处寻找,pandas/core/generic.py
的 __contains__
方法就是 return key in self._info_axis
。所以它检查索引!【参考方案2】:
例如,要确认 ds
的第 4 个值包含在其自身中:
len(set(ds.isin([ds.iloc[3]]))) > 1
让ds
成为具有示例值的 [index, pandas._libs.tslib.Timestamp] 形式的 Pandas DataSeries:
0 2018-01-31 19:08:27.465515
1 2018-02-01 19:08:27.465515
2 2018-02-02 19:08:27.465515
3 2018-02-03 19:08:27.465515
4 2018-02-04 19:08:27.465515
然后,我们使用 isin
本地方法获取布尔值的 DataSeries,其中每个条目指示 ds
中的位置是否与作为参数传递给函数的值匹配(因为 isin
需要一个值列表我们需要提供列表格式的值)。
接下来,我们使用set
全局方法来获取具有 1 个或 2 个值的集合,具体取决于是否存在匹配(True 和 False 值)或不匹配(只有 False 值)。
最后,我们检查集合是否包含超过 1 个值,如果是,则表示我们有匹配,否则没有匹配。
【讨论】:
【参考方案3】:import pandas as pd
# Create some dates:
data = 'date': ['2021-11-16', '2021-11-17', '2021-11-18']
df = pd.DataFrame(data)
# Convert dates in dataframe to pandas timestamps:
dates = pd.to_datetime(df['date'])
pd.Timestamp('2021-11-17') in dates.tolist() # returns True
pd.Timestamp('2021-11-15') in dates.tolist() # returns False
【讨论】:
以上是关于python - pandas - 检查数据框中是不是存在日期的主要内容,如果未能解决你的问题,请参考以下文章
如果在另一个数据框中确实存在,则删除行 - python pandas