【问题标题】:Is it possible to translate pandas datetime to weekday/weekend and season?是否可以将熊猫日期时间翻译为工作日/周末和季节?
【发布时间】:2020-02-20 06:32:42
【问题描述】:

我有一个 pandas 数据框,如果它的列采用日期时间格式 (year-month-day)。有什么方法可以创建一个新的列显示周末或工作日,以及一个列说明现在是什么季节?更好的是(但这个看起来要复杂得多,所以不是完全必要的)也可以是它是否是联邦假日(美国)。

例如,日期 2019-10-23 的实例是星期三,所以我想创建一个名为 day_type 的列填充“工作日”,以及一个名为 season 的列填充“秋天” .

【问题讨论】:

标签: python pandas data-manipulation


【解决方案1】:

使用 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/

【讨论】:

  • 这真的很有帮助,也可以解决我们可以做的工作日或周末df['is_weekday'] = df.date.dt.weekday<5
【解决方案2】:

我编写了一个函数,它以“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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 2017-06-05
    • 2021-12-06
    • 2017-12-12
    • 2019-02-13
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    相关资源
    最近更新 更多