如何在Pandas数据框中按行值对日期时间列进行排序?

时间:2016-09-26 22:05:20

标签: python python-2.7 sorting datetime pandas

我是Python和Pandas的新手,我已经在数据库表中提取了15个不同的日期时间列。我的任务是通常按行中的最新值到最新值对这些列进行排序。但是,数据不干净;有时,如果A栏的日期在第0行的B列日期之前,A将出现在第1行的B之后。

我编写了一些函数(为简单起见,在这里进行了编辑),通过计算A之前和之后B中日期的百分比来比较两列,然后根据该百分比对列进行排序:

def get_percentage(df, df_subset):
    return len(df_subset)/float(len(df))    

def duration_report(df, earlier_column, later_column):   
    results = {}
    td = df[later_column] - df[earlier_column]
    results["Before"] = get_percentage(df, df.loc[td >= pd.Timedelta(0)])
    results["After"] = get_percentage(df, df.loc[td <= pd.Timedelta(0)])
    ind = "%s vs %s" % (earlier_column, later_column)
    return pd.DataFrame(data=results, index=[ind])

def order_date_columns(df, col1, col2):
    before = duration_report(df, col1, col2).Before.values[0]
    after = duration_report(df, col1, col2).After.values[0]
    if before >= after:
        return [col1, col2]
    else:
        return [col2, col1]

上述代码的目标是以编程方式实现以下内容:

  

如果Col A日期在Col B日期50 +%的时间之前到来,则Col A应该在Col B的最早到最晚的datetime列的列表之前。

order_date_columns()函数成功地将两列排序为正确的顺序,但如何将此排序一次应用于15+列?我已经查看了df.apply()lambdamap(),但还没有能够解决这个问题。

任何帮助(代码清晰度/效率)都将不胜感激!

2 个答案:

答案 0 :(得分:2)

如果您不介意使用一些快捷方式并使用每个日期列的中位数,这应该有效:

def order_date_columns(df, date_columns_to_sort):
    x = [(col, df[col].astype(np.int64).median()) for col in date_columns_to_sort]
    return [x[0] for x in sorted(x, key=lambda x: x[1])]

答案 1 :(得分:1)

由于您使用的是Python 2.7,因此可以使用<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> <svg width="1000" height="1000" id="this_svg"> <rect x="0" y="0" width="100" height="100" fill="blue" data-color="red"> </rect> <rect x="0" y="100" width="100" height="100" fill="green" data-color="purple"></rect> </svg>关键字参数cmp。要按照您要查找的顺序获取列名称,我会执行以下操作:

sorted

我确信有更多的Pythonic方法可以做到,但这应该有效。请注意,对于Python 3,您可以使用cmp_to_key实用程序。