如何将DataFrame按时间转换为每分钟一行的对应格式?
如何将DataFrame按时间转换为每分钟一行的对应格式?
嘿,我明白你的需求了——你现在的DataFrame里每行对应一整天的数据,w和w_4列各自存了1440个每分钟的数值,想要把它们拆成每分钟一行,同时把日期精确到分钟对吧?之前用reshape('1Min')没达到效果很正常,因为那个方法是针对已有时间索引的重采样,而你的情况需要先展开列表再生成对应时间,下面给你具体的解决方案:
步骤1:处理列表格式(如果需要)
首先要确保w和w_4列是列表类型,如果你的数据里这两列是带[]的字符串(比如你示例里显示的[887, 665, 793, 800,...),需要先把它们转换成列表:
import pandas as pd import ast # 假设你的原始DataFrame名为df df['w'] = df['w'].apply(ast.literal_eval) df['w_4'] = df['w_4'].apply(ast.literal_eval)
步骤2:展开列表并生成分钟级时间戳
接下来我们把列表拆分成单行,同时为每个数值匹配对应的分钟时间:
# 将day列转换为datetime类型,方便后续计算时间偏移 df['day'] = pd.to_datetime(df['day']) # 展开w和w_4列的列表,每个元素单独成一行 df_exploded = df.explode(['w', 'w_4'], ignore_index=True) # 计算每个原始日期下的分钟偏移量(0到1439,对应一天的1440分钟) df_exploded['minute_offset'] = df_exploded.groupby(['user_id', 'day']).cumcount() # 生成精确到分钟的时间戳 df_exploded['datetime'] = df_exploded['day'] + pd.to_timedelta(df_exploded['minute_offset'], unit='min') # 整理最终的列顺序和名称 final_df = df_exploded[['user_id', 'datetime', 'w', 'w_4']].rename(columns={'datetime': 'day'})
效果说明
运行完上面的代码后,你就会得到想要的格式:
- 每行对应一分钟的数据
day列显示精确到分钟的时间戳(比如2021-08-01 00:00:00)w和w_4列分别对应该分钟的单个数值
为什么reshape('1Min')没用?
reshape(准确说是resample)是针对时间序列索引的重采样工具,它需要你的DataFrame已经有按时间排序的索引,然后对已有数据按时间间隔聚合或拆分。而你的原始数据是把一天的所有分钟数据存在一个列表里,不属于这种场景,所以需要先展开列表再生成对应时间。
备注:内容来源于stack exchange,提问作者HsinYuan0810




