将工作日从整数转换为实际名称时出错

Error while converting weekdays from integer to actual name

我正在尝试使用 python 中的日历库将 pd.dt.weekdays() 列从整数形式转换为其实际名称。 这是我一直在做的,

hours = uber_data["Date/Time"].dt.hour
week_day = uber_data["Date/Time"].dt.weekday
date = uber_data["Date/Time"].dt.date
weekly_data = pd.concat([week_day, hours, date], axis=1)
weekly_data.columns = ["Week Day", "Hour", "Date"]

weekly_data["Week Day"] = weekly_data["Week Day"].apply(lambda x: calendar.day_name[x])

我得到的错误是,

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-e18771afc253> in <module>()
----> 1 weekly_data["Week Day"] = weekly_data["Week Day"].apply(lambda x: calendar.day_name[x])
      2 weekly_data["Week Day"]

2 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   4211             else:
   4212                 values = self.astype(object)._values
-> 4213                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   4214 
   4215         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-24-e18771afc253> in <lambda>(x)
----> 1 weekly_data["Week Day"] = weekly_data["Week Day"].apply(lambda x: calendar.day_name[x])
      2 weekly_data["Week Day"]

/usr/lib/python3.6/calendar.py in __getitem__(self, i)
     76 
     77     def __getitem__(self, i):
---> 78         funcs = self._days[i]
     79         if isinstance(i, slice):
     80             return [f(self.format) for f in funcs]

TypeError: list indices must be integers or slices, not str

我已经尝试更改“星期几”列的数据类型,但错误仍然存​​在。 编辑: 使用 Series.dt.day_name() 解决了该问题。如果有人可以提供日历库的解决方案,我们将不胜感激。

你可以试试Series.dt.day_name:

weekly_data = pd.DataFrame()
weekly_data['Week Day'] = uber_data["Date/Time"].dt.hour
weekly_data['Hour'] = uber_data["Date/Time"].dt.weekday
weekly_data['Date'] = uber_data["Date/Time"].dt.date
weekly_data['Day'] = uber_data["Date/Time"].dt.day_name()
print(weekly_date)