【问题标题】:How to get all the seasons from a list of months in pandas dataframe?如何从熊猫数据框中的月份列表中获取所有季节?
【发布时间】:2020-10-24 16:22:29
【问题描述】:

我正在分析一个包含医疗训练营信息的数据集。 从这个训练营的开始日期和结束日期(日/月/年)开始,我创建了一个函数,列出了开始日期和结束日期之间的所有月份

import datetime
from dateutil.rrule import rrule, MONTHLY

def list_months_in_date(start_date: datetime, end_date : datetime) -> list :
    strt_dt = datetime.datetime.strptime(start_date, "%d-%b-%y")
    end_dt = datetime.datetime.strptime(end_date, "%d-%b-%y")
    dates = [dt for dt in rrule(MONTHLY, dtstart=strt_dt, until=end_dt)]
    distinct_months = []
    months = [date.strftime("%B") for date in dates if date.strftime("%B") not in distinct_months]
    distinct_months = list(set(months))

    return distinct_months 

我的功能是从一系列日期中获取季节

def list_months_to_season(distinct_months : list) -> list:
    season = []
    autumn = ["September","October","November"]
    winter = ["December","January","February"]
    summer = ["June","July","August"]
    spring = ["March","April","May"]
    for month in distinct_months:
        if month in autumn :
            season.append("autuumn")
        if month in winter :
            season.append("winter")
        if month in spring :
            season.append("spring")
        if month in summer :
            season.append("summer")
    
    return season

我需要的是获取开始日期和结束日期之间的季节(夏季、春季、冬季、秋季) 为了拥有

|id_medicalcamp|start_date|end_date  |seasons      |
|    0010      |01/06/2019|01/09/2020|summer,autumn|  

我正在运行以下代码

df_med_camps['season_label'] = df_med_camps.apply(lambda data : list_months_in_date(data["Camp_Start_Date"],data["Camp_End_Date"]))

这给了我错误 KeyError: 'Camp_Start_Date'

【问题讨论】:

  • 使用pd.Series.dt.month 获取月份数,然后使用map 直接进行季节。无需创建自定义函数。
  • 也许我明白你的意思,但是如何将列表放入列 season_label ?

标签: python pandas list algorithm


【解决方案1】:

首先将您的日期投射到Datetime,然后创建季节的dict 和月份的map

df["start_date"] = pd.to_datetime(df["start_date"], format="%d/%m/%Y")
df["end_date"] = pd.to_datetime(df["end_date"], format="%d/%m/%Y")

s = {6:"Summer", 7:"Summer", 8:"Summer", 9:"Autumn", 10: "Autumn"} #...

df["label"] = df.filter(like="date").apply(lambda d: d.dt.month.map(s)).agg(", ".join, axis=1)

print (df)

   id_medicalcamp start_date   end_date           label
0              10 2019-06-01 2020-09-01  Summer, Autumn

【讨论】:

  • 对谁在看这个问题进行一点更正:03 年 8 月 16 日的正确格式是“%d-%b-%y”
  • 您没有提供示例数据,所以我使用的是您的预期输出,即%m。对于重复的季节,您可以使用...agg(lambda d: ",".join(d.unique()), axis=1)
猜你喜欢
  • 1970-01-01
  • 2017-06-14
  • 2015-09-06
  • 2021-03-20
  • 2017-09-12
  • 2022-01-11
  • 1970-01-01
  • 2022-11-27
  • 2020-11-16
相关资源
最近更新 更多