如何使用Pandas按日期排序含\N缺失值的DataFrame(日期时间同列)
解决Pandas按日期时间排序并剔除无效行的问题
没问题,这事儿分三步就能搞定,我给你详细说清楚:
第一步:先剔除包含\N的无效行
因为你的第2列(注意Pandas里列索引从0开始,对应代码里的iloc[:, 2])存在\N的垃圾值,我们先把这些行过滤掉。直接用布尔索引就能实现:
# 过滤掉第2列等于\N的行 df_clean = df[df.iloc[:, 2] != r'\N']
这里加r是为了让Python把\N当成原始字符串处理,避免转义出问题。
第二步:把日期时间字符串转成Pandas的datetime类型
原来的日期和时间在同一个单元格里是字符串格式,直接排序会按字符顺序来(简单场景可能没问题,但复杂时间范围下肯定出错),所以必须转成专门的datetime类型:
# 将第2列转换为datetime格式,Pandas会自动识别这种YYYY-MM-DD HH:MM:SS的标准格式 df_clean.iloc[:, 2] = pd.to_datetime(df_clean.iloc[:, 2])
如果你的日期格式比较特殊,还可以给pd.to_datetime传format参数指定格式,比如format='%Y-%m-%d %H:%M:%S',不过你的例子里这个格式是标准的,不用额外设置。
第三步:按转换后的日期时间列排序
现在就可以放心排序了,直接用sort_values方法:
# 按第2列升序排序(早的日期在前),如果要降序加参数ascending=False df_sorted = df_clean.sort_values(by=df_clean.columns[2]) # 可选:排序后重置索引,让索引从0开始连续 df_sorted = df_sorted.reset_index(drop=True)
完整代码示例
把上面的步骤整合起来,就是这样:
import pandas as pd # 模拟你的原始DataFrame data = { 0: [240, 250, 300, 280], 1: ['RSOW', 'RSOW', 'RSOW', 'RSOW'], 2: ['2008-07-11 20:35:00', '2008-06-27 19:10:00', r'\N', '2008-08-01 10:00:00'] } df = pd.DataFrame(data) # 步骤1:剔除无效行 df_clean = df[df.iloc[:, 2] != r'\N'] # 步骤2:转换日期时间类型 df_clean.iloc[:, 2] = pd.to_datetime(df_clean.iloc[:, 2]) # 步骤3:排序并重置索引 df_sorted = df_clean.sort_values(by=df_clean.columns[2]).reset_index(drop=True) print(df_sorted)
运行后输出的结果就是按日期时间从早到晚排序的干净DataFrame啦。
内容的提问来源于stack exchange,提问作者ggegoge
相关产品推荐
相关产品推荐

