【问题标题】:How to remove microseconds from DateTimeIndex in dataframe in Python?如何从 Python 数据框中的 DateTimeIndex 中删除微秒?
【发布时间】:2020-11-28 00:52:07
【问题描述】:

我想从索引中删除微秒。

我的索引是这样的:

DatetimeIndex(['2003-11-20 13:07:40.895000+00:00',
           '2003-11-20 13:16:13.039000+00:00',
           '2003-11-20 13:24:44.868000+00:00',
           '2003-11-20 13:33:17.013000+00:00',
           '2003-11-20 13:41:49.158000+00:00',
           '2003-11-20 13:50:20.987000+00:00',
           '2003-11-20 13:58:53.132000+00:00',
           '2003-11-20 14:07:24.961000+00:00',
           '2003-11-20 14:15:57.106000+00:00',
           '2003-11-20 14:24:28.935000+00:00',
           ...
           '2003-12-04 19:28:56.025000+00:00',
           '2003-12-04 19:37:27.854000+00:00',
           '2003-12-04 19:45:59.999000+00:00',
           '2003-12-04 19:54:32.143000+00:00',
           '2003-12-04 20:03:03.972000+00:00',
           '2003-12-04 20:11:36.117000+00:00',
           '2003-12-04 20:20:07.946000+00:00',
           '2003-12-04 20:28:40.091000+00:00',
           '2003-12-04 20:37:11.920000+00:00',
           '2003-12-04 20:45:44.065000+00:00'],
          dtype='datetime64[ns, UTC]'

我想删除微秒,以便只有这样的东西:'2003-12-04 20:45:44' 我不想将其转换为字符串,因为它需要保留日期时间,因为它是数据帧的索引。 我一直在寻找这个,但我只找到了这个,它不起作用:

df.index.replace(microsecond=0, inplace = True)

你能帮帮我吗?

【问题讨论】:

  • 试试df.index.floor('S')
  • 我得到这个结果:'2003-11-20 13:07:40+00:00'
  • 那个 +00:00 是时区信息,你不需要那个然后试试:didx.floor('S').tz_localize(None)
  • 试试df.index.astype('datetime64[s]')
  • also idx.floor('S')'.tz_convert(None)... 所以不同之处在于当您想更改时区时,tz_convert 会将时间更改为新 tz 中的时间,tz_localize 保持时间不变并标记新的 tz

标签: python pandas datetime indexing type-conversion


【解决方案1】:

给定一个带有时区信息和毫秒数据的 pd.DateTimeIndex,如下所示:

didx = pd.DatetimeIndex(['2003-11-20 13:07:40.895000+00:00',
           '2003-11-20 13:16:13.039000+00:00',
           '2003-11-20 13:24:44.868000+00:00',
           '2003-11-20 13:33:17.013000+00:00',
           '2003-11-20 13:41:49.158000+00:00',
           '2003-11-20 13:50:20.987000+00:00',
           '2003-11-20 13:58:53.132000+00:00',
           '2003-11-20 14:07:24.961000+00:00',
           '2003-11-20 14:15:57.106000+00:00',
           '2003-11-20 14:24:28.935000+00:00',
           '2003-12-04 19:28:56.025000+00:00',
           '2003-12-04 19:37:27.854000+00:00',
           '2003-12-04 19:45:59.999000+00:00',
           '2003-12-04 19:54:32.143000+00:00',
           '2003-12-04 20:03:03.972000+00:00',
           '2003-12-04 20:11:36.117000+00:00',
           '2003-12-04 20:20:07.946000+00:00',
           '2003-12-04 20:28:40.091000+00:00',
           '2003-12-04 20:37:11.920000+00:00',
           '2003-12-04 20:45:44.065000+00:00'],
          dtype='datetime64[ns, UTC]')

您可以使用pd.DateTimeIndex.floortz_localize(None) 将时间戳截断为秒并删除时区信息。

didx.floor('S').tz_localize(None)

输出:

DatetimeIndex(['2003-11-20 13:07:40', '2003-11-20 13:16:13',
               '2003-11-20 13:24:44', '2003-11-20 13:33:17',
               '2003-11-20 13:41:49', '2003-11-20 13:50:20',
               '2003-11-20 13:58:53', '2003-11-20 14:07:24',
               '2003-11-20 14:15:57', '2003-11-20 14:24:28',
               '2003-12-04 19:28:56', '2003-12-04 19:37:27',
               '2003-12-04 19:45:59', '2003-12-04 19:54:32',
               '2003-12-04 20:03:03', '2003-12-04 20:11:36',
               '2003-12-04 20:20:07', '2003-12-04 20:28:40',
               '2003-12-04 20:37:11', '2003-12-04 20:45:44'],
              dtype='datetime64[ns]', freq=None)

【讨论】:

    【解决方案2】:

    您应该能够在每个上使用.strftime('%Y-%m-%d %H:%M:%S')

    【讨论】:

    • 是的,它起作用了,但是它将索引转换为字符串。
    • 这将允许您传递一个日期时间对象,根据需要进行格式化,并作为一个日期时间对象返回。所以 datetime.strptime( {date_time object}, '%Y-%m-%d %H:%M:%S')
    • 有几个选项真是太好了......这不像 Scott 的评论那么有效,但它完成了工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2017-12-03
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多