csv 当将字符串转换为日期时间格式时,日期时间混合了日和月

mm9b1k5b  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(120)

我正在处理一个数据集,它有一个格式为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])

zzzyeukh

zzzyeukh1#

我建议您定义一个日期解析器,然后在解析时将其用于名为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 docs以了解更多细节和示例。

ibps3vxo

ibps3vxo2#

从你提供的信息中我看不出你是如何得到11个月的,而且只针对经济数据集。也许我错过了问题中的一些细节。
我试着在你提供的示例CSV上运行你的代码,看起来Pandas正确地解析了日期,基于格式"day-month-year"。

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 |

相关问题