pandas中如何将选中的日期列转为可按时间切片的日期或datetime index格式
解决方案
你可以根据自己的使用场景选以下两种常用方案:
方案1:保留宽表结构,直接将日期列名转为datetime类型列索引
这种方案不用改动原表的行结构,适合平时以用户维度分析为主,仅偶尔需要按日期筛选列的场景。
操作代码如下:
# 1. 定义你要转换的40个日期列,这里示例是排除非日期字段的所有列,你也可以直接写你筛选好的40个列名列表 non_date_cols = ['id', 'access_type'] date_cols = [col for col in df.columns if col not in non_date_cols] # 2. 将日期列的列名转为datetime格式 df.columns = df.columns.map(lambda x: pd.to_datetime(x) if x in date_cols else x)
转换完成后就可以直接按日期切片筛选列:
# 示例:筛选2018年9月到10月的所有数据 df_sep_oct = df.loc[:, pd.to_datetime('2018-09-01'):pd.to_datetime('2018-10-01')] # 示例:筛选所有2018年的列 df_2018 = df.loc[:, df.columns.year == 2018]
方案2:转为长表格式,设置datetime行索引
这种方案符合tidy数据规范,适合需要做大量时间序列计算、分组统计的场景,后续各类分析的代码会更简洁。
操作代码如下:
# 1. 宽表转长表,把所有日期列转为行维度 df_long = df.melt( id_vars=['id', 'access_type'], # 保留的非日期维度 var_name='date', # 存储日期的列名 value_name='usage' # 存储使用量的列名,可根据你的实际业务修改 ) # 2. 转换日期列为datetime格式,设为行索引 df_long['date'] = pd.to_datetime(df_long['date']) df_long = df_long.set_index('date')
转换完成后可以非常灵活的按日期切片:
# 示例:筛选2018年10月到11月的所有数据 df_oct_nov = df_long.loc['2018-10':'2018-11'] # 示例:筛选指定用户2018年9月及之后的使用数据 df_user1 = df_long[(df_long['id'] == 'user_1') & (df_long.index >= '2018-09')]
内容的提问来源于stack exchange,提问作者ande
相关产品推荐
相关产品推荐

