提问人:Sara María Cano Martínez 提问时间:11/14/2023 最后编辑:Matt Johnson-PintSara María Cano Martínez 更新时间:11/14/2023 访问量:73
将字符串转换为日期时间格式时,日期时间混合了日和月 [已关闭]
Datetime mixes day and month when converting strings to datetime format [closed]
问:
我正在使用一个数据集,该数据集具有格式为日期列,但是此列是一个对象,我需要它是日期时间格式才能提取日期的月份。但是,当使用函数时,表示月初的日期(如 )被转换为 ,而实际上应该是 。因此,当我尝试提取月份时,结果是 而不是 .这不会发生在这样的日期上:,因为它被转换为 ,并且月份是 。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
这是我的数据集中的输出:表
如果我使用 ,同样的情况仍然会发生。
我正在使用 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])
答:
我建议您定义一个日期解析器,然后在解析时命名的特定列上使用它: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
文档。
我无法从您提供的信息中看到您是如何获得 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 |
评论
pd.to_datetime(data_flights['date'], format='%d-%m-%Y')