【问题标题】:Python: convert object column into datetime and compare with current datePython:将对象列转换为日期时间并与当前日期进行比较
【发布时间】:2018-07-22 11:22:23
【问题描述】:

我的数据框有一列包含日期,如

+-----+---------------------+
| Nr  |        Date         |
+-----+---------------------+
| 146 | 2011-03-11 00:00:00 |
| 654 | 2014-05-16 00:00:00 |
| 312 | 2020-12-01 00:00:00 |
| 675 | 9999-12-31 00:00:00 |
+-----+---------------------+

现在我想将它们(当前类型对象)转换为数据框中的日期时间类型,并将它们与当前日期进行比较。

为了转换,我试过了

df['Date'] = pd.to_datetime(df['Date'], format = '%Y-%m-%d %H:%M:%S')

但它返回错误:

OutOfBoundsDatetime:越界纳秒时间戳:9999-12-31 00:00:00

结果应该是相同的数据框,但只有有效日期。所以所有日期已经过去的行都应该被删除,只剩下未来的日期:

+-----+---------------------+
| Nr  |        Date         |
+-----+---------------------+
| 312 | 2020-12-01 00:00:00 |
| 675 | 9999-12-31 00:00:00 |
+-----+---------------------+

感谢您的支持。

【问题讨论】:

  • 这里有点好奇;为什么您认为结果应该只包含有效日期并且为您删除了无效日期?看看here,除非你传入明确不同的error arg 值,否则你不会得到你所期望/上面所说的。总之,pandas 对你的9999 不满意。
  • df['Date'] = pd.to_datetime(df['Date'], format = '%Y-%m-%d %H:%M:%S', errors= 'coerce') 或者如果您想省略无效日期,请使用 errors = 'ignore'
  • 这不起作用。每个日期9999-12-31 00:00:00,然后变成NaT
  • 据我所知,不可能做你想做的事。最大。 Pandas 可以处理的时间是pd.Timestamp.max = Timestamp('2262-04-11 23:47:16.854775807')。您的选择是 ignore 错误并传递字符串,或 coerce 错误并传递 NaT。

标签: python datetime dataframe type-conversion


【解决方案1】:

Pandas 使用以纳秒分辨率表示的时间戳。由于时间戳是以 64 位数字存储的,因此时间戳的跨度是有限的,应该在一定范围之间。

范围指定here

【讨论】:

  • 这就是我寻求帮助的原因。日期如前所述,因此我需要一个可以使用它的解决方案。无需转换为日期时间。但如上所述,我需要一个只包含未来日期的数据框。
【解决方案2】:

如果您只想保留未来的日期,并且想要保留 9999 年的日期,您可以执行以下操作:

df['Date'][(pd.to_datetime(df['Date'], errors = 'coerce') > pd.to_datetime('today')) | (pd.to_datetime(df['Date'], errors = 'coerce').isnull())]

这将适用于您显示的数据,但会为任何 NaT 传递 True,所以要小心。

【讨论】:

    【解决方案3】:

    这个 OutOfBoundsDatetime: OutOfBoundsDatetime: Out Of bounds nanosecond timestamp: 9999-12-31 00:00:00 错误是因为您将字符串转换为日期时间,年份为 9999

    pandas 的时间戳限制只有 584 年(1677-2262)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-02
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多