以日/月/年格式按日期对熊猫数据框进行排序

时间:2020-12-27 20:18:39

标签: python-3.x pandas dataframe

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

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

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 具有日/月/年格式的日期条目。

2 个答案:

答案 0 :(得分:1)

您可以做的是在读取 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

答案 1 :(得分:1)

试试:

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