【问题标题】:Sort Pandas dataframe column index by date按日期对 Pandas 数据框列索引进行排序
【发布时间】:2020-08-17 08:53:19
【问题描述】:

我想按列索引对数据框进行排序。问题是我的列是直接从我的 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”实例之间不支持“

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

【问题讨论】:

  • 为什么两个日期末尾有'.' 而一个没有?
  • 请忽略'.'那是错误的。对这种混乱感到非常抱歉
  • @anmol Sureka ,请尝试编辑后的代码。由于您在问题中编辑的列不是日期时间格式。

标签: python pandas dataframe


【解决方案1】:

首先删除'。'在数据源表中的日期结束时。 对于这个数据

    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)

【讨论】:

    【解决方案2】:

    第一:

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

    然后:

    df.sort_index(axis = 1)
    

    更新:正如 cmets 中提到的 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]
    

    【讨论】:

    • @Ch3steR 酷!不知道功能。用你的建议更新了答案。
    • 添加了一些细节,如果不好,请随时恢复更改。
    【解决方案3】:

    您的错误来自于 您将字符串类型与日期类型混合。要么你所有的列名都是字符串,要么都是日期但你不能同时混合。

    例如

    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
    

    并且不会给你任何错误。

    【讨论】:

    • 嗨。谢谢你的回复。 '。'不在源表中。它是不小心来到这里的。对于那个很抱歉。当我导入 excel 时,我的日期以 datetime.datetime 格式导入,因此它给了我错误:TypeError: '
    猜你喜欢
    • 2017-12-26
    • 2018-08-27
    • 2021-04-05
    • 1970-01-01
    • 2012-12-01
    • 2018-03-18
    • 2017-02-04
    • 2014-05-08
    • 2021-07-22
    相关资源
    最近更新 更多