如何基于Linux Timestamp列向Pandas DataFrame添加多周期分钟数列?
问题描述
我有一个包含Linux时间戳列的Pandas DataFrame,需要从该时间戳列提取各周期的分钟数,包括minute_of_hour、minute_of_day、minute_of_week、minute_of_month、minute_of_year,且因数据表规模庞大,不能使用循环,需高效解决。
原始数据示例:
TimeStamp var1 var2 1659494100 5.22 6.34 1659494160 4.33 7.33 1659494220 5.46 7.21 1659494280 4.33 4.51 1659494340 6.45 5.67 ...
期望输出格式:
TimeStamp var1 var2 minute_of_hour minute_of_day minute_of_week minute_of_month minute_of_year 1659494100 5.22 6.34 35 155 3035 3035 308315 1659494160 4.33 7.33 36 156 3036 3036 308316 1659494220 5.46 7.21 37 157 3037 3037 308317 1659494280 4.33 4.51 38 158 3038 3038 308318 1659494340 6.45 5.67 39 159 3039 3039 308319 ...
高效解决方案
利用Pandas的矢量化时间操作处理,完全避免循环,适配大规模数据集:
将Linux时间戳转换为Pandas datetime类型
先把TimeStamp列转成datetime64[ns]格式,这是后续所有时间计算的基础,操作是矢量化的,效率极高:import pandas as pd # 假设你的DataFrame名为df df['datetime'] = pd.to_datetime(df['TimeStamp'], unit='s')计算各周期分钟数
基于转换后的datetime列,通过Pandas的dt访问器进行矢量化计算:# 小时内的分钟数:直接取分钟值 df['minute_of_hour'] = df['datetime'].dt.minute # 一天内的分钟数:小时数*60 + 分钟数 df['minute_of_day'] = df['datetime'].dt.hour * 60 + df['datetime'].dt.minute # 一周内的分钟数:周几(0=周一,6=周日)*1440 + 一天内分钟数 df['minute_of_week'] = df['datetime'].dt.dayofweek * 1440 + df['minute_of_day'] # 一月内的分钟数:当前时间与当月第一天的时间差转成总分钟数 month_start = df['datetime'].dt.to_period('M').dt.start_time df['minute_of_month'] = (df['datetime'] - month_start).dt.total_seconds() // 60 # 一年内的分钟数:当前时间与当年第一天的时间差转成总分钟数 year_start = df['datetime'].dt.to_period('Y').dt.start_time df['minute_of_year'] = (df['datetime'] - year_start).dt.total_seconds() // 60(可选)清理临时列
如果不需要保留datetime列,可以删除:df.drop('datetime', axis=1, inplace=True)
关键说明
- 所有操作均为Pandas底层优化的矢量化运算,处理速度远快于Python循环,适合百万级甚至更大规模的数据集;
- 周起始默认遵循Pandas规则(周一为0),若需改为周日为0,可将
dt.dayofweek替换为(df['datetime'].dt.weekday + 1) % 7; - 计算月/年分钟数时,通过
to_period获取周期起始时间,再计算时间差的总秒数并转换为分钟,逻辑准确且高效。
内容的提问来源于stack exchange,提问作者Marcin Dudziuk
相关产品推荐
相关产品推荐

