【问题标题】: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()

标签: python datetime pandas dataframe


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 2016-08-01
      • 2020-12-31
      • 2018-09-04
      • 2021-06-26
      • 1970-01-01
      • 2020-09-24
      • 2019-09-26
      相关资源
      最近更新 更多