按日期排序数据框

问题描述 投票:0回答:3

我正在导入一个 excel 文件,其中一列是 dd/mm/yyyy 格式的日期。

我从excel文件导入的时候,我以为是理解为字符串。我需要按日期对整个 DataFrame 进行排序,因此我执行以下代码: 将 pandas 导入为 pd

import pandas as pd

dictionary = {
      "DATE" : ['12/02/2023', '02/01/2023', '02/01/2023', '10/02/2023'],    
      "CONCEPT" : ['Supermarket','Restaurant', 'Gas', 'Suscription'],
      "EUR" : [-150,-50,-45,-95]
          }
df = pd.DataFrame(dictionary)

df['DATE'] =  pd.to_datetime(df['DATE']).dt.strftime('%d/%m/%Y')

df = df.sort_values(by=['DATE'],axis=0, ascending=True)

如果执行此示例,您会发现它工作得非常好,因为第一行日期 12/02/2023 排在最后一个位置。但是,当我使用我的真实 Excel 文件时,这个日期被解释为 2023 年 12 月 2 日。此外,它将日期列排序为字符串而不是日期;因此,31/01/2023 在 28/02/2023 之后。

我该如何解决这个问题?

python pandas dataframe xls
3个回答
1
投票

您需要使用

dayfirst
参数到
to_datetime
以使转换按预期进行。使用您的示例数据:

pd.to_datetime(df['DATE'])
# 0   2023-12-02
# 1   2023-02-01
# 2   2023-02-01
# 3   2023-10-02
pd.to_datetime(df['DATE'], dayfirst=True)
# 0   2023-02-12
# 1   2023-01-02
# 2   2023-01-02
# 3   2023-02-10

您的

DATE
列随后被排序为字符串,因为您已使用
strftime
将其转换为字符串。您应该先排序,然后转换为仅用于显示目的的字符串。

df['DATE'] =  pd.to_datetime(df['DATE'], dayfirst=True)
df = df.sort_values(by=['DATE'],axis=0, ascending=True)
df['DATE'] = df['DATE'].dt.strftime('%d/%m/%Y')

输出

         DATE      CONCEPT  EUR
1  02/01/2023   Restaurant  -50
2  02/01/2023          Gas  -45
3  10/02/2023  Suscription  -95
0  12/02/2023  Supermarket -150

如果您需要重置索引,只需使用

reset_index

df = df.reset_index(drop=True)

输出:

         DATE      CONCEPT  EUR
0  02/01/2023   Restaurant  -50
1  02/01/2023          Gas  -45
2  10/02/2023  Suscription  -95
3  12/02/2023  Supermarket -150

0
投票

存储日期的理想格式是 ISO 格式:yyyy-mm-dd

将字符串格式更改为:

dt.strftime('%Y-%m-%d')

这不仅是国际标准,而且按日期顺序排列整齐,没有任何进一步的黑客攻击。

您可以使用 hack 将其显示在屏幕上,因为不同的国家/地区对于订购商品有不同的约定,例如欧洲的 dd-mm-yyyy;北美为 mm-dd-yyyy,中国为 yyyy-mm-dd。


0
投票

您可以使用read_excel() 函数的parse_dates参数来确保在导入期间将日期列解析为日期。您还可以使用 date_format 参数明确指定日期格式:

import pandas as pd
df = pd.read_excel('your_file.xlsx', parse_dates=['DATE'], date_format='%d/%m/%Y')
df = df.sort_values(by=['DATE'], axis=0, ascending=True)

或者,您可以使用带有格式参数的 pd.to_datetime() 将日期列转换为日期时间对象以指定输入日期格式:

import pandas as pd

dictionary = {
  "DATE" : ['12/02/2023', '02/01/2023', '02/01/2023', '10/02/2023'],    
  "CONCEPT" : ['Supermarket','Restaurant', 'Gas', 'Suscription'],
  "EUR" : [-150,-50,-45,-95]
      }
df = pd.DataFrame(dictionary)
df['DATE'] = pd.to_datetime(df['DATE'], format='%d/%m/%Y')
df = df.sort_values(by=['DATE'],axis=0, ascending=True)
© www.soinside.com 2019 - 2024. All rights reserved.