【问题标题】:Num day to Name day with PandasNum day to Name day with Pandas
【发布时间】:2015-05-19 17:19:11
【问题描述】:

如果我使用这个函数pd.DatetimeIndex(dfTrain['datetime']).weekday 我得到当天的数字,但我没有找到任何给出日期名称的函数......所以我需要将 0 转换为星期一,1 转换为星期二等等开。

这是我的数据框的示例:

            datetime    season holiday workingday weather   temp    atemp   humidity    windspeed   count
    0   2011-01-01 00:00:00 1   0   0   1   9.84    14.395  81  0.0000  16
    1   2011-01-01 01:00:00 1   0   0   1   9.02    13.635  80  0.0000  40
    2   2011-01-01 02:00:00 1   0   0   1   9.02    13.635  80  0.0000  32
    3   2011-01-01 03:00:00 1   0   0   1   9.84    14.395  75  0.0000  13
    4   2011-01-01 04:00:00 1   0   0   1   9.84    14.395  75  0.0000  1
    5   2011-01-01 05:00:00 1   0   0   2   9.84    12.880  75  6.0032  1
    6   2011-01-01 06:00:00 1   0   0   1   9.02    13.635  80  0.0000  2
    7   2011-01-01 07:00:00 1   0   0   1   8.20    12.880  86  0.0000  3
    8   2011-01-01 08:00:00 1   0   0   1   9.84    14.395  75  0.0000  8
    9   2011-01-01 09:00:00 1   0   0   1   13.12   17.425  76  0.0000  14

还有一个问题,pandas.DatetimeIndex.dayofweekpandas.DatetimeIndex.weekday有什么区别?

【问题讨论】:

  • 那么为什么不使用带有当天名称的 7 元组呢?
  • 您可以从calendar.day_name获取本地化日期名称数组

标签: python datetime pandas dayofweek weekday


【解决方案1】:

您可以使用的最新版本dt.day_name

df['weekday'] = df['datetime'].dt.day_name
print df
             datetime  season  holiday  workingday  weather   temp   atemp  \
0 2011-01-01 00:00:00       1        0           0        1   9.84  14.395   
1 2011-01-01 01:00:00       1        0           0        1   9.02  13.635   
2 2011-01-01 02:00:00       1        0           0        1   9.02  13.635   
3 2011-01-01 03:00:00       1        0           0        1   9.84  14.395   
4 2011-01-01 04:00:00       1        0           0        1   9.84  14.395   
5 2011-01-01 05:00:00       1        0           0        2   9.84  12.880   
6 2011-01-01 06:00:00       1        0           0        1   9.02  13.635   
7 2011-01-01 07:00:00       1        0           0        1   8.20  12.880   
8 2011-01-01 08:00:00       1        0           0        1   9.84  14.395   
9 2011-01-01 09:00:00       1        0           0        1  13.12  17.425   

   humidity  windspeed  count   weekday  
0        81     0.0000     16  Saturday  
1        80     0.0000     40  Saturday  
2        80     0.0000     32  Saturday  
3        75     0.0000     13  Saturday  
4        75     0.0000      1  Saturday  
5        75     6.0032      1  Saturday  
6        80     0.0000      2  Saturday  
7        86     0.0000      3  Saturday  
8        75     0.0000      8  Saturday  
9        76     0.0000     14  Saturday  

【讨论】:

  • 链接已损坏 (404)。
【解决方案2】:

一种方法,只要 datetime 已经是 datetime 列,就应用datetime.strftime 来获取工作日的字符串:

In [105]:

df['weekday'] = df[['datetime']].apply(lambda x: dt.datetime.strftime(x['datetime'], '%A'), axis=1)
df
Out[105]:
             datetime  season  holiday  workingday  weather   temp   atemp  \
0 2011-01-01 00:00:00       1        0           0        1   9.84  14.395   
1 2011-01-01 01:00:00       1        0           0        1   9.02  13.635   
2 2011-01-01 02:00:00       1        0           0        1   9.02  13.635   
3 2011-01-01 03:00:00       1        0           0        1   9.84  14.395   
4 2011-01-01 04:00:00       1        0           0        1   9.84  14.395   
5 2011-01-01 05:00:00       1        0           0        2   9.84  12.880   
6 2011-01-01 06:00:00       1        0           0        1   9.02  13.635   
7 2011-01-01 07:00:00       1        0           0        1   8.20  12.880   
8 2011-01-01 08:00:00       1        0           0        1   9.84  14.395   
9 2011-01-01 09:00:00       1        0           0        1  13.12  17.425   

   humidity  windspeed  count   weekday  
0        81     0.0000     16  Saturday  
1        80     0.0000     40  Saturday  
2        80     0.0000     32  Saturday  
3        75     0.0000     13  Saturday  
4        75     0.0000      1  Saturday  
5        75     6.0032      1  Saturday  
6        80     0.0000      2  Saturday  
7        86     0.0000      3  Saturday  
8        75     0.0000      8  Saturday  
9        76     0.0000     14  Saturday  

关于你的另一个问题,dayofweekweekday 没有区别。

将工作日的地图定义为等效的字符串并在工作日调用地图会更快:

dayOfWeek={0:'Monday', 1:'Tuesday', 2:'Wednesday', 3:'Thursday', 4:'Friday', 5:'Saturday', 6:'Sunday'}
df['weekday'] = df['datetime'].dt.dayofweek.map(dayOfWeek)

对于0.15.0 之前的版本,以下应该可以工作:

import datetime as dt
df['weekday'] = df['datetime'].apply(lambda x: dt.datetime.strftime(x, '%A'))

0.18.1 及更新版本

现在有一种新的便捷方法dt.weekday_name 可以完成上述操作

0.23.0 及更新版本

weekday_name 现在已弃用 dt.day_name

【讨论】:

    【解决方案3】:

    使用dt.weekday_namedeprecated since pandas 0.23.0,改为使用dt.day_name()

    df.datetime.dt.day_name()
    
    0    Saturday
    1    Saturday
    2    Saturday
    3    Saturday
    4    Saturday
    5    Saturday
    6    Saturday
    7    Saturday
    8    Saturday
    9    Saturday
    Name: datetime, dtype: object
    

    【讨论】:

      【解决方案4】:

      添加到@jezrael 的上一个正确答案,您可以使用这个:

      import calendar
      df['weekday'] = pd.Series(pd.Categorical(df['datetime'].dt.weekday_name, categories=list(calendar.day_name)))
      

      它还根据this 为您的新分类变量提供order(在本例中:'Monday'、...、'Sunday')。这可能会对您的分析的后续步骤有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-09
        • 2022-12-27
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多