有一个数据表格,每一列的名称(字段)是不同的日期,但是原始数据日期是乱的,没有按照日期的从早到晚正常排列。由于数量很大,要是手工一个个重新排序太麻烦了,就想到了用pandas内置的排序功能,经过CSDN网上查找,发现对数据可以按行或列进行排序,代码非常简单:
DataFrame.sort_index(axis=1, ascending=True, inplace=True)
#axis=1按列名排序,如果是要按行排序就是axis=0. ascending=True是增序,从小到大,如果是从大到小逆序,则ascending=Flase
于是使用上述方法生成代码如下:
#日期排序有问题的代码
import pandas as pd
#打开csv格式的数据文件
data=pd.read_csv('数据汇总表.csv',encoding='UTF-8')
#按照列名从小到大排序
data.sort_index(axis=1,ascending=True, inplace=True)
#查看排序后的前5行数据是否正常
print(pd1.head(5))
#将排序好的文件保存为新的csv文件
data.to_csv(path_or_buf='排序后汇总表.csv',encoding='UTF-8')
执行完程序后发现有点问题,程序并没有完全按照日期的先后顺序排序,说是没有完全,是因为有部分排序正确,有部分列日期却先后颠倒了,比如下面这个,2020-5-31排序错误,跑到了11月和2月中间。
经过网上查询资料和实际测试,发现需要把原始日期字符转换为Python的标准datetime日期数据,然后再执行pandas 的排序。
基本代码示例如下:
#日期排序正确的代码
import datetime #导入日期处理函数
import pandas as pd
df=pd.read_csv('数据汇总表.csv',header=0,encoding='utf-8',engine='python') #在Jupyter Notebook里运行需要加engine='python'
col_names=df.columns.tolist() #将列名转为列表
#使用datatime将日期字符(格式为"%Y-%m-%d")转换为标准的Python时间变量,然后再用.date()功能提取出日期,如果不加这个,生成的时间变量会包括时分秒,但是我并不需要,所以仅需要年月日,最后赋值给新的列表变量new_cols,
new_cols=[datetime.datetime.strptime(col, "%Y-%m-%d").date() for col in col_names]
#将df数据表的列名修改为新的标准日期列表
df.columns=new_cols
#重新对df进行排序,axis=1表示按照列名排序
df.sort_index(axis=1,ascending=True, inplace=True)
#保存排序后的文件,不用保存行索引序号
df.to_csv('排序后数据.csv',encoding='UTF-8', mode='w', index=None,index_label=None)
经过日期标准化后重新对数据表的列名进行排序,完美的解决了问题。