笛卡尔积操作丢失DatetimeIndex时分秒的问题及解决方法
笛卡尔积操作丢失DatetimeIndex时分秒的解决方法
问题场景
生成包含小时级时间戳的DatetimeIndex:
todays_date = datetime.datetime.now().date() time_index = pd.date_range(todays_date-datetime.timedelta(days=1), end=todays_date, freq='h') # 按小时间隔生成
生成的DatetimeIndex示例:
DatetimeIndex(['2023-01-11 00:00:00', '2023-01-11 01:00:00', '2023-01-11 02:00:00', ..., '2023-01-12 00:00:00'], dtype='datetime64[ns]', freq='H')
需要和ids列表做笛卡尔积:
ids = [1,2,3,4,5]
执行以下代码后,DatetimeIndex的时分秒部分丢失:
pd.DataFrame(product(time_index, ids), columns=['time','id'])
得到的结果类似:
time id 0 2023-01-11 1 1 2023-01-11 2 ...
join和merge操作也出现相同问题。
原因分析
使用itertools.product处理DatetimeIndex时,其中的元素会被隐式转换为datetime.date类型(仅保留日期部分),而非原有的datetime.datetime类型,导致时分秒信息丢失。
解决方法
方法1:利用交叉连接实现
将DatetimeIndex转为Series,再与ids的Series执行交叉连接:
import pandas as pd import datetime todays_date = datetime.datetime.now().date() time_index = pd.date_range(todays_date - datetime.timedelta(days=1), end=todays_date, freq='h') ids = [1,2,3,4,5] # 转换为Series并执行交叉连接 time_series = pd.Series(time_index, name='time') id_series = pd.Series(ids, name='id') result_df = time_series.reset_index(drop=True).merge(id_series, how='cross')
方法2:通过多级索引构建
使用pd.MultiIndex.from_product直接生成包含时间和id的多级索引,再转为DataFrame:
import pandas as pd import datetime todays_date = datetime.datetime.now().date() time_index = pd.date_range(todays_date - datetime.timedelta(days=1), end=todays_date, freq='h') ids = [1,2,3,4,5] # 构建多级索引并转为DataFrame result_df = pd.DataFrame( index=pd.MultiIndex.from_product([time_index, ids], names=['time', 'id']) ).reset_index()
两种方法生成的result_df中,time列都会完整保留原DatetimeIndex的时分秒信息,类型为datetime64[ns]。
内容的提问来源于stack exchange,提问作者Hossein Yousefi
相关产品推荐
相关产品推荐

