【问题标题】:Sort pandas dataframe by date in day/month/year format以日/月/年格式按日期对熊猫数据框进行排序
【发布时间】:2021-04-04 18:42:19
【问题描述】:

我正在尝试解析 csv 文件中的数据,按日期对它们进行排序并将排序后的数据框写入新的 csv 文件中。

假设我们有一个非常简单的 csv 文件,其中的日期条目遵循 day/month/year 模式:

Date,Reference
15/11/2020,'001'
02/11/2020,'002'
10/11/2020,'003'
26/11/2020,'004'
23/10/2020,'005'

我将 csv 读入 Pandas 数据框。当我尝试根据升序中的日期对数据框进行排序时,我希望数据按如下方式排序

23/10/2020,'005'
02/11/2020,'002'
10/11/2020,'003'
15/11/2020,'001'
26/11/2020,'004'

遗憾的是,这不是我得到的。

如果我尝试date 转换为datetime 然后排序,那么某些日期条目将转换为月/日/年(例如 2020 -10-23 而不是 2020-23-10),这会打乱顺序:

      date     reference
2020-02-11         '002'
2020-10-11         '003'
2020-10-23         '005'
2020-11-15         '001'
2020-11-26         '004'

如果我排序而不转换为datetime,那么排序也是错误的:

      date     reference
02/11/2020         '002'
10/11/2020         '003'
15/11/2020         '001'
23/10/2020         '005'
26/11/2020         '004'

这是我的代码:

import pandas as pd

df = pd.read_csv('order_dates.csv',
                 header=0,
                 names=['date', 'reference'],
                 dayfirst=True)

df.reset_index(drop=True, inplace=True)
# df.date = pd.to_datetime(df.date)
df.sort_val

df.sort_values(by='date', ascending=True, inplace=True)
print(df)
df.to_csv('sorted.csv')

为什么按日期排序这么难?有人可以解释为什么上述排序尝试失败了吗? 理想情况下,我希望sorted.csv 具有日/月/年格式的日期条目。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    试试:

    df.loc[:,'date'] = pd.to_datetime(df.loc[:, 'date'], format='%d/%m-%Y')
    

    【讨论】:

    • 这行得通!但日期格式为年月日(例如 2020-10-23)。我们可以修改它,让它使用日/月/年格式吗?
    • 试试.strftime('%d-%m-%Y') 这里是python strftime 字符引用的链接:strftime.org
    【解决方案2】:

    您可以在读取 csv 文件时指定datetime 格式。为此,请尝试:

    >>> df = pd.read_csv('filename.csv', parse_dates=['Date'],infer_datetime_format='%d/%m/%Y').sort_values(by='Date')
    

    这将从 csv 读取您的日期,并为您提供对日期进行排序的输出。

            Date Reference
    4 2020-10-23      '005
    1 2020-11-02     '002'
    2 2020-11-10     '003'
    0 2020-11-15     '001'
    3 2020-11-26     '004'
    

    现在剩下的就是简单地将格式更改为所需的格式

    >>> df['Date'] = df['Date'].dt.strftime('%d/%m/%Y')
    

    但请记住,这会将Date 改回string(对象)

    >>> df
             Date Reference
    4  23/10/2020      '005
    1  02/11/2020     '002'
    2  10/11/2020     '003'
    0  15/11/2020     '001'
    3  26/11/2020     '004'
    
    >>> df.dtypes
    Date         object
    

    【讨论】:

    • 您能否解释一下为什么在datetimestrftime 中使用不同的格式参数?另外,如果您能解释一下为什么我的尝试无法排序,那将非常有帮助。
    • 顺便说一句,您的回答并没有解决问题;它的排序如下:02/11/2020, 10/11/2020, 15/11/2020, 23/10/2020, 26/11/2020 其中第 4 个条目排序错误。
    • 嗨,刚刚看到这个。我会编辑我的答案,因为我可能在回答时很着急。
    • 这对你有用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    • 2019-04-10
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多