日期格式为DD/MM/YYYY时,如何正确从DataFrame提取月份?
问题原因
你的日期格式是DD/MM/YYYY(日/月/年),但pandas的DatetimeIndex默认会把斜杠分隔的日期解析成MM/DD/YYYY(月/日/年),导致月份和日期被搞混——比如03/02/2022被当成了3月2日,而非2月3日,所以提取的月份出现错误。
修正方案
方案1:解析时指定dayfirst=True
直接告诉pandas日期的第一位是日,就能正确解析格式:
import pandas as pd month_labels = {1: 'Jan', 2: 'Feb', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August',9: 'Sept', 10: 'Oct', 11: 'Nov', 12: 'Dec'} # 关键:添加dayfirst=True参数 df['month'] = pd.DatetimeIndex(df['Settlement_Date'], dayfirst=True).month x = df['month'].apply(lambda x: month_labels[x]) print(x)
方案2:明确指定日期格式(更严谨)
通过format参数直接声明日期格式为%d/%m/%Y,彻底避免解析歧义:
import pandas as pd month_labels = {1: 'Jan', 2: 'Feb', 3: 'March', 4: 'April', 5: 'May', 6: 'June', 7: 'July', 8: 'August',9: 'Sept', 10: 'Oct', 11: 'Nov', 12: 'Dec'} # 先将字符串转为正确的datetime类型 df['datetime'] = pd.to_datetime(df['Settlement_Date'], format='%d/%m/%Y') # 提取月份 df['month'] = df['datetime'].month x = df['month'].apply(lambda x: month_labels[x]) print(x)
方案3:不用自定义字典,直接生成月份名称
利用pandas自带的日期格式化工具,省去手动编写映射字典的步骤:
import pandas as pd # 先转成正确的datetime类型 df['datetime'] = pd.to_datetime(df['Settlement_Date'], format='%d/%m/%Y') # 生成三位月份缩写(Jan/Feb/Mar...) x = df['datetime'].dt.strftime('%b') # 如果需要全称(January/February...),将%b替换为%B即可 # x = df['datetime'].dt.strftime('%B') print(x)
以上三种方法都能得到预期结果:Jan, Jan, Feb, Feb, Mar, Mar
内容的提问来源于stack exchange,提问作者beginofwork
相关产品推荐
相关产品推荐

