将字符串转换为日期时间格式时,日期时间混合了日和月 [已关闭]

Datetime mixes day and month when converting strings to datetime format [closed]

提问人:Sara María Cano Martínez 提问时间:11/14/2023 最后编辑:Matt Johnson-PintSara María Cano Martínez 更新时间:11/14/2023 访问量:73

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

10天前关闭。

我正在使用一个数据集,该数据集具有格式为日期列,但是此列是一个对象,我需要它是日期时间格式才能提取日期的月份。但是,当使用函数时,表示月初的日期(如 )被转换为 ,而实际上应该是 。因此,当我尝试提取月份时,结果是 而不是 .这不会发生在这样的日期上:,因为它被转换为 ,并且月份是 。dd-mm-yyyypd.to_datetime11-02-20222022-11-022022-02-11110231-03-20222022-03-3103

这是我的代码:

data_flights['date'] = pd.to_datetime(data_flights['date'], format='%d-%m-%Y')
data_flights['month'] = data_flights['date'].dt.month

这是我的数据集中的输出:

如果我使用 ,同样的情况仍然会发生。 我正在使用 python 3.9 和 jupyter。dayfirst = True

我的数据来自 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])
python pandas csv 日期时间

评论

1赞 Matt Johnson-Pint 11/14/2023
您正在使用什么数据库?如果您指的是传统的关系数据库系统,例如 PostgreSQL、MySQL 等,则它们的日期类型字段没有任何格式。因此,您看到的任何格式都已在检索或输出时应用。您需要在此处显示该代码。
0赞 Sara María Cano Martínez 11/14/2023
@MattJohnson品脱 非常感谢您的提问。我正在处理一个 csv 文件,列“data”有一个 dtype 对象,这就是为什么我试图将其转换为 datetime。
0赞 Matt Johnson-Pint 11/14/2023
谢谢你的细节。请编辑您的问题,以包括 csv 文件中数据的小示例,以及您用于读取 csv 文件的代码,以及您可能拥有的用于解析日期的任何代码。另外,你可能想看看这个
0赞 Sara María Cano Martínez 11/14/2023
@MattJohnson品脱我已经编辑了这个问题,非常感谢您的反馈。我会读你的建议。
0赞 FObersteiner 11/14/2023
关闭此不可重现,请参阅下面的 Zach Young 的回答。 是将一系列日期解析为字符串的正确方法,格式类似于 11-02-2022 (dd-mm-yyyy)。pd.to_datetime(data_flights['date'], format='%d-%m-%Y')

答:

0赞 Matt Johnson-Pint 11/14/2023 #1

我建议您定义一个日期解析器,然后在解析时命名的特定列上使用它: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_formatdate_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 文档

1赞 Zach Young 11/14/2023 #2

我无法从您提供的信息中看到您是如何获得 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)

我得到一个月的 2:

       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)

我的输出 .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 |