【问题标题】:Keep only the rows with dates只保留带日期的行
【发布时间】:2019-01-02 15:05:46
【问题描述】:

我有一个从 excel 导入的非常混乱的数据框,其中只有一些行包含第一列中的日期(索引 0,没有标题)。如何删除所有不包含日期的行?

【问题讨论】:

  • 向我们展示您的尝试是否有用?
  • 另外,您能否提供一些示例数据和您的预期输出(请参阅minimal reproducible example)。很难想象什么算作日期,什么算作没有任何数据。
  • df[df.Date.notnull()]
  • 所以我一直在尝试选择字符串在哪里包含看起来像日期的东西,即。 df.loc[df[0].str.contains('2017', na=False)] 但该方法返回空 df
  • 请发布数据帧的样本和所需的输出。另请查看minimal reproducible example

标签: python pandas


【解决方案1】:

我会使用pd.to_datetime 和errors='coerce',然后通过索引删除空日期:

例如:

>>> df
            x  y
0  2011-02-03  1
1           x  2
2           1  3
3  2012-03-03  4

>>> df[pd.to_datetime(df.x, errors='coerce').notnull()]
            x  y
0  2011-02-03  1
3  2012-03-03  4

注意:如果您的列中有不同的日期格式,这会导致一些问题

解释:

使用pd.to_datetime 和errors='coerce' 将查找类似日期的字符串,如果找不到则返回NaT(为空):

>>> pd.to_datetime(df.x, errors='coerce')
0   2011-02-03
1          NaT
2          NaT
3   2012-03-03
Name: x, dtype: datetime64[ns]

因此,您可以使用notnull 获取所有非空值:

>>> pd.to_datetime(df.x, errors='coerce').notnull()
0     True
1    False
2    False
3     True
Name: x, dtype: bool

并将其用作原始数据帧的掩码

【讨论】:

  • 投反对票的人能否解释一下为什么这是一个不充分的答案?
  • 我也不明白这里和其他场合的反对意见。当然,答案是猜测问题,但受过教育。因此,如果您想责怪某人,请责怪 OP,而不是花时间解释解决方案的人
  • 我认为只要可以在没有format arg 的情况下自动推断所有格式,pandas.to_datetime() 仍然可以毫无问题地解析具有多种格式的列。例如。 df = pd.DataFrame({'date': ['03-04-1988', 'Mar. 4, 1988', 'March 4 1988', '03.04.1988', '3/4/88', '03/04/1988']}) 会得到妥善处理。
  • @ALollz,同意,在这种情况下它可能会起作用,但请考虑数据框:df = pd.DataFrame({'date': ['2011-13-03', '2012-03-13']}),其中第一个是 YYYY-DD-MM,第二个是 YYYY-MM-DD。在这种情况下,它不会解析所有被视为“类似日期”的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2021-03-02
相关资源
最近更新 更多