You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将DataFrame按时间转换为每分钟一行的对应格式?

如何将DataFrame按时间转换为每分钟一行的对应格式?

嘿,我明白你的需求了——你现在的DataFrame里每行对应一整天的数据,ww_4列各自存了1440个每分钟的数值,想要把它们拆成每分钟一行,同时把日期精确到分钟对吧?之前用reshape('1Min')没达到效果很正常,因为那个方法是针对已有时间索引的重采样,而你的情况需要先展开列表再生成对应时间,下面给你具体的解决方案:

步骤1:处理列表格式(如果需要)

首先要确保ww_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
  • ww_4列分别对应该分钟的单个数值

为什么reshape('1Min')没用?

reshape(准确说是resample)是针对时间序列索引的重采样工具,它需要你的DataFrame已经有按时间排序的索引,然后对已有数据按时间间隔聚合或拆分。而你的原始数据是把一天的所有分钟数据存在一个列表里,不属于这种场景,所以需要先展开列表再生成对应时间。

备注:内容来源于stack exchange,提问作者HsinYuan0810

火山引擎 最新活动