如何从 Python 数据框中的 DateTimeIndex 中删除微秒?

Posted

技术标签:

【中文标题】如何从 Python 数据框中的 DateTimeIndex 中删除微秒?【英文标题】:How to remove microseconds from DateTimeIndex in dataframe in Python? 【发布时间】: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 【参考方案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')

【讨论】:

是的,它起作用了,但是它将索引转换为字符串。 你可以试试docs.python.org/3.4/library/… 这将允许您传递一个日期时间对象,根据需要进行格式化,并作为一个日期时间对象返回。所以 datetime.strptime( date_time object, '%Y-%m-%d %H:%M:%S') 有几个选项真是太好了......这不像 Scott 的评论那么有效,但它完成了工作

以上是关于如何从 Python 数据框中的 DateTimeIndex 中删除微秒?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?

如何从 Python 数据框中的 DateTimeIndex 中删除微秒?

如何从python中的数据框中删除多索引?

如何从 python pandas 中的另一个数据框中检索数据? [复制]

使用python过滤数据框中的时间

如何从python中的pandas数据框中的列中提取关键字(字符串)