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数据框中的行排序/计数

如果在另一个数据框中确实存在,则删除行 - python pandas

如果 ID 存在于其他数据框中,则 Python Pandas 数据框在新列中添加“1”

在 Pandas 数据框中检查一列并返回另一列

python Pandas - 从数据框中删除列

python pandas:重命名数据框中的系列?