按日期对Pandas数据框列索引进行排序

时间:2020-08-16 18:45:32

标签: python pandas dataframe

我想按列索引对数据框进行排序。问题是我的列是直接从我的Excel中导入的“日期” dd / mm / yyyy。例如:

    10/08/20  12/08/20 11/08/20
0   2.0        6.0       15.0
1   6.0        11.0      8.0
2   4.0        7.0       3.0
3   7.0        12.0      2.0
4   12.0       5.0       7.0

我想要的输出是:

    10/08/20  11/08/20 12/08/20
0   2.0        15.0      6.0
1   6.0        8.0       11.0
2   4.0        3.0       7.0
3   7.0        2.0       12.0
4   12.0       7.0       5.0

我正在使用

df.sort_index(axis=1)

这给了我以下错误:

TypeError:“ datetime.datetime”的实例之间不支持“ <” 和'str'

我想在熊猫数据框中执行此操作。任何帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:2)

首先删除'。数据表中日期的结尾。 此数据的

    10-08-2020  12-08-2020  11-08-2020
0   2           6           15
1   6           11          8
2   4           7           3
3   7           12          2
4   12          5           7

尝试

import datetime as dt
df.columns=pd.Series(df.columns).apply(lambda d: dt.datetime(d, dt.datetime.strptime(d, '%d/%m/%Y')))
df.sort_index(axis = 1)

答案 1 :(得分:1)

第一:

df.columns = df.columns.str.replace(".", "")

然后:

df.sort_index(axis = 1)

更新:如Ch3steR在评论中所述。用于删除“。”

df.columns = df.columns.str.rstrip(".")

使用str.rstrip进行概括,因为day.month.year是有效格式,因此使用str.replace将会替换每个.

示例:

s = pd.Series(["1.2.2020."])
pd.to_datetime(s.str.replace('.', ''))
# 0   2020-12-20         # Interpeted wrong
# dtype: datetime64[ns]

pd.to_datetime(s.str.rstrip('.'))
# 0   2020-01-02
# dtype: datetime64[ns]

答案 2 :(得分:0)

您的错误来自以下事实:您将字符串类型与日期类型混合在一起。您所有的列名都是字符串,或者都是日期,但是不能混在一起。

例如

l=[[2.0, 6.0, 15.0],
   [6.0, 11.0, 8.0],
   [4.0, 7.0, 3.0],
   [7.0, 12.0, 2.0],
   [12.0, 5.0, 7.0]]

d = pd.DataFrame(l, columns =['10/08/20',  '12/08/20', '11/08/20']) # column names are strings

收益

   10/08/20  12/08/20  11/08/20
0       2.0       6.0      15.0
1       6.0      11.0       8.0
2       4.0       7.0       3.0
3       7.0      12.0       2.0
4      12.0       5.0       7.0

现在,如果我想按输入的列名进行排序

d.sort_index(axis = 1)

   10/08/20  11/08/20  12/08/20
0       2.0      15.0       6.0
1       6.0       8.0      11.0
2       4.0       3.0       7.0
3       7.0       2.0      12.0
4      12.0       7.0       5.0

另一方面,列名是日期,如

from dateutil.parser import parse
d = pd.DataFrame(l, columns =[parse('10/08/20'),  parse('12/08/20'), parse('11/08/20')])

我们将拥有

   2020-10-08  2020-12-08  2020-11-08   #now column names are dates
0         2.0         6.0        15.0
1         6.0        11.0         8.0
2         4.0         7.0         3.0
3         7.0        12.0         2.0
4        12.0         5.0         7.0

同样,您可以使用相同的内容对其进行排序

details.sort_index(axis = 1)
  
   2020-10-08  2020-11-08  2020-12-08
0         2.0        15.0         6.0
1         6.0         8.0        11.0
2         4.0         3.0         7.0
3         7.0         2.0        12.0
4        12.0         7.0         5.0

并且不会给您任何错误。