You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从pandas DatetimeIndex提取时间并保留datetime64[ns]类型

问题描述

我生成了这样的DatetimeIndex:

DatetimeIndex(['1970-01-01 09:30:00.015105074',
               '1970-01-01 09:30:00.059901970',
               '1970-01-01 09:30:00.113246707',
               '1970-01-01 09:30:00.113246707',
               '1970-01-01 09:30:00.113246707',
               '1970-01-01 09:30:00.113246707',
               '1970-01-01 09:30:00.113246707',
               '1970-01-01 09:30:00.154178213',
               '1970-01-01 09:30:00.173594287',
               '1970-01-01 09:30:00.202322801',
               ...
               '1970-01-01 15:59:59.544086847',
               '1970-01-01 15:59:59.544121155',
               '1970-01-01 15:59:59.544124809',
               '1970-01-01 15:59:59.544125669',
               '1970-01-01 15:59:59.544126313',
               '1970-01-01 15:59:59.544129843',
               '1970-01-01 15:59:59.544131783',
               '1970-01-01 15:59:59.544132627',
               '1970-01-01 15:59:59.544133264',
               '1970-01-01 15:59:59.871751084'],
              dtype='datetime64[ns]', name=0, length=112673, freq=None)

生成代码是:

GOOG_msg_df = pd.read_csv('GOOG_msg_5.csv', header = None, index_col = 0)
dt_index = pd.to_datetime(GOOG_msg_df.index, unit = 's')

我想提取里面的时间部分(去掉日期),试了这段代码:

pd.Series(dt_index.time)

结果是:

0         09:30:00.015105
1         09:30:00.059901
2         09:30:00.113246
3         09:30:00.113246
4         09:30:00.113246
               ...       
112668    15:59:59.544129
112669    15:59:59.544131
112670    15:59:59.544132
112671    15:59:59.544133
112672    15:59:59.871751
Length: 112673, dtype: object

问题在于结果的dtype是object而不是datetime64[ns],没法做依赖这个类型的操作,比如:

dt_index > pd.Timestamp('1970-01-01 10:00:00')
>>> array([False, False, False, ...,  True,  True,  True])

有没有办法提取时间部分的同时保留datetime64[ns]类型?

解决方案

方法1:直接用原索引做时间比较(最省事)

要是你只是需要做时间判断(比如筛选10点之后的数据),其实根本不用去掉日期——所有时间都在同一天(1970-01-01),直接拿原DatetimeIndex和目标时间戳比就行,结果就是你要的时间比较效果:

mask = dt_index > pd.Timestamp('1970-01-01 10:00:00')

方法2:把时间转成固定日期的datetime64

如果确实需要单独的时间datetime列,可以把提取的时间字符串重新组合成以固定日期为基准的DatetimeIndex:

# 提取时间字符串,转成datetime64,默认日期是当前日期
time_only_dt = pd.to_datetime(dt_index.strftime('%H:%M:%S.%f'))
# 要是想统一用1970-01-01当基准:
time_only_dt = pd.to_datetime('1970-01-01 ' + dt_index.strftime('%H:%M:%S.%f'))

这样得到的time_only_dt是datetime64[ns]类型,完全支持所有datetime操作,比如:

time_only_dt > pd.Timestamp('1970-01-01 10:00:00')

方法3:通过时间差转换

还有一种方式是计算每个时间和当天0点的时间差,再把这个差值加到固定日期上:

# 计算从当天00:00到当前时间的时长
time_delta = dt_index - dt_index.normalize()
# 把时长加到1970-01-01上,得到datetime64类型的时间
time_only_dt = pd.Timestamp('1970-01-01') + time_delta

这个方法也能得到纯时间对应的datetime64值,和原数据的时间部分完全匹配。


内容的提问来源于stack exchange,提问作者QuantCode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:54:05