如何从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
相关产品推荐
相关产品推荐

