有没有可能把Pandas的约会时间翻译成工作日/周末和季节?

2024-05-15 10:56:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,如果它的列是datetime格式(year-month-day)。有没有办法创建一个新的专栏,说周末或工作日,以及一个专栏,说这是什么季节?更妙的是(但这一次似乎更复杂,所以不是完全必要的)也将是是否是一个联邦假日(美国)。你知道吗

例如,日期2019-10-23的一个实例是星期三,所以我想创建一个名为day_type的列来填充“weekday”,一个名为season的列来填充“fall”。你知道吗


Tags: 数据实例pandasdatetime格式typeyear联邦
2条回答

strftime很简单:

import pandas as pd 

df = pd.DataFrame({'string_date': ['2019-10-23', '2019-10-24', '2019-10-23']})
df['date'] = pd.to_datetime(df['string_date'], format='%Y-%m-%d', errors='ignore')
df['day_of_week'] = df['date'].dt.strftime('%A')

结果1:

  string_date       date    day_of_week
0  2019-10-23   2019-10-23   Wednesday
1  2019-10-24   2019-10-24    Thursday
2  2019-10-23   2019-10-23   Wednesday

添加季节可以使用以下公式: Link

df['season'] = (df['date'].dt.month%12 + 3)//3

结果2:

      string_date       date day_of_week  season
0  2019-10-23 2019-10-23   Wednesday       4
1  2019-10-24 2019-10-24    Thursday       4
2  2019-10-23 2019-10-23   Wednesday       4

Strftime参考: http://strftime.org/

我编写了一个函数,它采用“yyyy-mm-dd”格式的字符串参数,并返回季节和星期几的元组。请根据您的需要修改功能。你知道吗

from datetime import date, datetime

def date_week(date_str):
    """
    this method returns season and day of week tuple from str
    arg in the format 'yyyy-mm-dd'
    """

    datetime_obj = datetime.strptime(date_str, '%Y-%m-%d')
    weekdays = {0:'monday',
               1:'tuesday',
               2:'wednesday',
               3:'thursday',
               4:'friday',
               5:'saturday',
               6:'sunday'}
    day_of_week = weekdays[datetime_obj.weekday()]  # returns day of week


    Y = 2000 # dummy leap year to allow input X-02-29 (leap day)
    seasons = [('winter', (date(Y,  1,  1),  date(Y,  3, 20))),
               ('spring', (date(Y,  3, 21),  date(Y,  6, 20))),
               ('summer', (date(Y,  6, 21),  date(Y,  9, 22))),
               ('autumn', (date(Y,  9, 23),  date(Y, 12, 20))),
               ('winter', (date(Y, 12, 21),  date(Y, 12, 31)))]
    if isinstance(datetime_obj, datetime):
        datetime_obj = datetime_obj.date()
    datetime_obj = datetime_obj.replace(year=Y)
    season = next(season for season, (start, end) in seasons
                if start <= datetime_obj <= end)  # returns season

    return day_of_week, season

如果我们调用date_week("2019-10-23"),它将返回('wednesday', 'autumn')

相关问题 更多 >