我正在导入一个 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 之后。
我该如何解决这个问题?
您需要使用
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
将字符串格式更改为:
dt.strftime('%Y-%m-%d')
这不仅是国际标准,而且按日期顺序排列整齐,没有任何进一步的黑客攻击。
您可以使用 hack 将其显示在屏幕上,因为不同的国家/地区对于订购商品有不同的约定,例如欧洲的 dd-mm-yyyy;北美为 mm-dd-yyyy,中国为 yyyy-mm-dd。
您可以使用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)