Pandas筛选日期时间列转字典遇时间戳问题及优化方案咨询
问题解答
一、为什么得到的是时间戳而非Datetime类型?
你使用.values.tolist()时,Pandas的Datetime列会被转换为numpy的datetime64类型,而numpy数组转Python列表时,datetime64会自动解析为纳秒级整数时间戳,所以最终得到的是一串整数而非datetime对象。另外你的循环代码里还存在硬编码错误:df.loc[df['name'] == 'BOB', ...]应该改为df.loc[df['name'] == name, ...],否则所有员工的结果都会是BOB的排班数据。
二、保留Datetime类型的修正方法
如果要维持原逻辑并保留datetime对象,不要用.values.tolist(),改用apply将每行转成tuple后再转列表:
results = {} names = df['name'].unique().tolist() for name in names: # 修正硬编码错误,并用apply(tuple, axis=1)保留datetime类型 times = df.loc[df['name'] == name, ['timein', 'timeout']].apply(tuple, axis=1).tolist() results[name] = times
三、更符合Pandas风格的实现方式
无需手动循环,直接用groupby+apply生成目标字典:
results = df.groupby('name').apply( lambda group: group[['timein', 'timeout']].apply(tuple, axis=1).tolist() ).to_dict()
四、直接用Pandas计算时间差(更高效)
你的核心需求是判断员工当前下班时间与下一个上班时间的间隔,完全不需要转字典手动判断,直接用Pandas的groupby+shift就能实现:
# 按员工分组,获取下一条记录的上班时间 df['next_timein'] = df.groupby('name')['timein'].shift(-1) # 计算时间差 df['time_diff'] = df['next_timein'] - df['timeout'] # 筛选时间差小于固定时长的记录(假设fixed_duration是timedelta类型) fixed_duration = pd.Timedelta(hours=12) filtered_df = df[df['time_diff'] < fixed_duration]
内容的提问来源于stack exchange,提问作者xtian
相关产品推荐
相关产品推荐

