将字符串转换为日期时间格式时,日期和月份混淆。

3
我正在处理一个数据集,其中有一个日期列的格式为dd-mm-yyyy,但是这个列是一个对象,我需要将其转换为日期时间格式,以便提取日期的月份。然而,当使用pd.to_datetime函数时,表示月初的日期,如11-02-2022,被转换为2022-11-02,而实际上应该是2022-02-11。因此,当我尝试提取月份时,结果是11而不是02。对于31-03-2022这样的日期,不会出现这种情况,因为它被转换为2022-03-31,月份是03
这是我的代码:
data_flights['date'] = pd.to_datetime(data_flights['date'], format='%d-%m-%Y')
data_flights['month'] = data_flights['date'].dt.month

这是我的数据集输出: table 如果我使用dayfirst = True,情况仍然相同。 我正在使用Python 3.9和Jupyter。
我的数据来自2个CSV文件。一个包含经济舱机票的信息,另一个包含商务舱机票的信息。这两个数据集都具有相同的格式:
date,airline,ch_code,num_code,dep_time,from,time_taken,stop,arr_time,to,price
11-02-2022,Air India,AI,868,18:00,Delhi,02h 00m,non-stop ,20:00,Mumbai,"25,612"
11-02-2022,Air India,AI,624,19:00,Delhi,02h 15m,non-stop ,21:15,Mumbai,"25,612"
11-02-2022,Air India,AI,531,20:00,Delhi,24h 45m,"1-stop",20:45,Mumbai,"42,220"
11-02-2022,Air India,AI,839,21:25,Delhi,26h 30m,"1-stop",23:55,Mumbai,"44,450"

我加载两个数据集的方式是:
data_economy = pd.read_csv('economy.csv')
data_business = pd.read_csv('business.csv')

然后我像这样合并了两个:
economy_df = data_economy.assign(ticket_class = 0)
business_df = data_business.assign(ticket_class = 1)
data_flights = pd.concat([economy_df,business_df])

1
你正在使用哪个数据库?如果你指的是传统的关系型数据库系统,比如PostgreSQL、MySQL等等,它们的日期类型字段没有任何格式。因此,你看到的任何格式都是在检索或输出时应用的。你需要在这里展示相应的代码。 - undefined
@MattJohnson-Pint 非常感谢您的问题。我正在处理一个csv文件,其中的列'data'的数据类型是对象(object),所以我正在尝试将其转换为日期时间(datetime)类型。 - undefined
感谢提供详细信息。请编辑您的问题,包括来自CSV文件的一个小例子,以及您用于读取CSV文件的代码,以及任何用于解析日期的代码。此外,您可能还想参考这个链接 - undefined
@MattJohnson-Pint 我已经编辑了问题,非常感谢你的反馈。我会阅读你提出的建议。 - undefined
将此问题标记为无法重现,查看下面Zach Young的答案。pd.to_datetime(data_flights['date'], format='%d-%m-%Y') 是将日期字符串解析为日期序列的正确方法,格式为11-02-2022 (dd-mm-yyyy)。 - undefined
2个回答

1
从您提供的信息中,我无法看出您是如何得到11月份的数据,而且只针对经济数据集。也许我在问题中错过了一些细节。
我尝试在您提供的示例CSV上运行您的代码,看起来Pandas根据"日-月-年"的格式正确解析了日期。
import pandas as pd

dtfmt_dmy = r"%d-%m-%Y"

df_economy = pd.read_csv("input1.csv")

df_economy["date"] = pd.to_datetime(df_economy["date"], format=dtfmt_dmy)
df_economy.insert(1, "month", df_economy["date"].dt.month)

print(df_economy)

我每个月得到两个月。
       date  month    airline ch_code  num_code dep_time   from time_taken       stop arr_time      to   price
0 2022-02-11      2  Air India      AI       868    18:00  Delhi    02h 00m  non-stop     20:00  Mumbai  25,612
1 2022-02-11      2  Air India      AI       624    19:00  Delhi    02h 15m  non-stop     21:15  Mumbai  25,612
2 2022-02-11      2  Air India      AI       531    20:00  Delhi    24h 45m     1-stop    20:45  Mumbai  42,220
3 2022-02-11      2  Air India      AI       839    21:25  Delhi    26h 30m     1-stop    23:55  Mumbai  44,450

我可以使用相同的日期格式字符串,将修改后的df保存下来。
df_economy.to_csv("output.csv", date_format=dtfmt_dmy)

我的output.csv文件看起来像这样:
| Idx | date       | month | airline   | ch_code | num_code | dep_time | from  | time_taken | stop      | arr_time | to     | price  |
|-----|------------|-------|-----------|---------|----------|----------|-------|------------|-----------|----------|--------|--------|
| 0   | 11-02-2022 | 2     | Air India | AI      | 868      | 18:00    | Delhi | 02h 00m    | non-stop  | 20:00    | Mumbai | 25,612 |
| 1   | 11-02-2022 | 2     | Air India | AI      | 624      | 19:00    | Delhi | 02h 15m    | non-stop  | 21:15    | Mumbai | 25,612 |
| 2   | 11-02-2022 | 2     | Air India | AI      | 531      | 20:00    | Delhi | 24h 45m    | 1-stop    | 20:45    | Mumbai | 42,220 |
| 3   | 11-02-2022 | 2     | Air India | AI      | 839      | 21:25    | Delhi | 26h 30m    | 1-stop    | 23:55    | Mumbai | 44,450 |

0
我建议您定义一个日期解析器,并在解析时将其应用于名为date的特定列。
from datetime import datetime
dateparse = lambda x: datetime.strptime(x, '%Y-%m-%d')

data_economy = pd.read_csv('economy.csv', parse_dates=['date'], date_parser=dateparse)
data_business = pd.read_csv('business.csv', parse_dates=['date'], date_parser=dateparse)

如果您使用的是Pandas 2.0.0或更新版本,可以使用date_format代替date_parser
data_economy = pd.read_csv('economy.csv', parse_dates=['date'], date_format='%Y-%m-%d')
data_business = pd.read_csv('business.csv', parse_dates=['date'], date_format='%Y-%m-%d')

然后你可以删除这行:
data_flights['date'] = pd.to_datetime(data_flights['date'], format='%d-%m-%Y')

...因为数据将已经以正确的格式解析为日期。
有关更多详细信息和示例,请参阅Panda的read_csv文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接