【问题标题】:Create a day-of-week column in a Pandas dataframe using Python使用 Python 在 Pandas 数据框中创建星期几列
【发布时间】:2021-09-19 20:52:27
【问题描述】:

使用 Python 在 Pandas 数据框中创建星期几列

我想将一个 csv 文件读入 pandas 数据帧,将一列日期从字符串格式解析为一个日期对象,然后生成一个指示星期几的新列。

这就是我正在尝试的:

我想做的是这样的:

import pandas as pd

import csv

df = pd.read_csv('data.csv', parse_dates=['date']))

df['day-of-week'] = df['date'].weekday()


AttributeError: 'Series' object has no attribute 'weekday'

感谢您的帮助。 詹姆斯

【问题讨论】:

  • 您想要一周中的整数天还是字符串名称?对于前者df['date'].dt.dayofweek 将起作用
  • 一个整数。并感谢您的格式评论。
  • 还有dt.weekday,与dayofweek相同,但要少2个字符

标签: python datetime pandas


【解决方案1】:

熊猫 0.23+

使用pandas.Series.dt.day_name(),因为pandas.Timestamp.weekday_name 已被弃用:

import pandas as pd


df = pd.DataFrame({'my_dates':['2015-01-01','2015-01-02','2015-01-03'],'myvals':[1,2,3]})
df['my_dates'] = pd.to_datetime(df['my_dates'])

df['day_of_week'] = df['my_dates'].dt.day_name()

输出:

    my_dates  myvals day_of_week
0 2015-01-01       1    Thursday
1 2015-01-02       2      Friday
2 2015-01-03       3    Saturday

熊猫 0.18.1+

正如用户 jezrael 在下面指出的那样,dt.weekday_name 是在 0.18.1 版本中添加的 Pandas Docs

import pandas as pd

df = pd.DataFrame({'my_dates':['2015-01-01','2015-01-02','2015-01-03'],'myvals':[1,2,3]})
df['my_dates'] = pd.to_datetime(df['my_dates'])
df['day_of_week'] = df['my_dates'].dt.weekday_name

输出:

    my_dates  myvals day_of_week
0 2015-01-01       1    Thursday
1 2015-01-02       2      Friday
2 2015-01-03       3    Saturday

原答案:

使用这个:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.dayofweek.html

看这个:

Get weekday/day-of-week for Datetime column of DataFrame

如果您想要一个字符串而不是整数,请执行以下操作:

import pandas as pd

df = pd.DataFrame({'my_dates':['2015-01-01','2015-01-02','2015-01-03'],'myvals':[1,2,3]})
df['my_dates'] = pd.to_datetime(df['my_dates'])
df['day_of_week'] = df['my_dates'].dt.dayofweek

days = {0:'Mon',1:'Tues',2:'Weds',3:'Thurs',4:'Fri',5:'Sat',6:'Sun'}

df['day_of_week'] = df['day_of_week'].apply(lambda x: days[x])

输出:

    my_dates  myvals day_of_week
0 2015-01-01       1       Thurs
1 2015-01-02       2         Fri
2 2015-01-01       3       Thurs

【讨论】:

  • Liam,我已将 datetime 模块作为 dt 导入,但我收到了这个新错误。你知道发生了什么事吗?再次感谢! df['day_of_week'] = df[‘my_dates'].dt.dayofweek AttributeError: 'Series' 对象没有属性 'dt'
  • 当你运行df.dtypes 时你得到my_dates datetime64[ns] 吗?
  • @JamesEaves dt 访问器已添加到 0.15.0 中,您可以升级吗?
  • 是的,我更新了,它运行良好。谢谢大家的帮助!
  • 回答自己:from calendar import day_abbr 然后data.index = [day_abbr[x] for x in data.index]
【解决方案2】:

在版本0.18.1中添加dt.weekday_name

print df
    my_dates  myvals
0 2015-01-01       1
1 2015-01-02       2
2 2015-01-03       3

print df.dtypes
my_dates    datetime64[ns]
myvals               int64
dtype: object

df['day_of_week'] = df['my_dates'].dt.weekday_name()
print df
    my_dates  myvals day_of_week
0 2015-01-01       1    Thursday
1 2015-01-02       2      Friday
2 2015-01-03       3    Saturday

assign 的另一个解决方案:

print df.assign(day_of_week = df['my_dates'].dt.weekday_name())
    my_dates  myvals day_of_week
0 2015-01-01       1    Thursday
1 2015-01-02       2      Friday
2 2015-01-03       3    Saturday

【讨论】:

    【解决方案3】:
    df =df['Date'].dt.dayofweek
    

    dayofweek 是数字格式

    【讨论】:

      【解决方案4】:

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

      df = pd.DataFrame({'my_dates':['2015-01-01','2015-01-02','2015-01-03'],'myvals':[1,2,3]})
      df['my_dates'] = pd.to_datetime(df['my_dates'])
      
      df['my_dates'].dt.day_name()
      
      0    Thursday
      1      Friday
      2    Saturday
      Name: my_dates, dtype: object
      

      【讨论】:

        【解决方案5】:

        以防万一 .dt 不适合您。尝试 .DatetimeIndex 可能会有所帮助。希望这里的代码和我们的测试结果可以帮助您修复它。问候,

        import pandas as pd
        import datetime
        
        df = pd.DataFrame({'Date':['2015-01-01','2015-01-02','2015-01-03'],'Number':[1,2,3]})
        
        df['Day'] = pd.DatetimeIndex(df['Date']).day_name() # week day name
        df.head()
        

        【讨论】:

          【解决方案6】:

          当日期为索引时

          …并且只需要前三个字母:

          df['day'] = df.index.day_name().str[:3]
          

          【讨论】:

            【解决方案7】:

            data['Day_Of_Week'] = pd.DatetimeIndex(data['Birth_Date']).day_name()

            命令将新列/特征作为数据['Day_Of-Week'] 从数据['Birth_Date'] 列中追加,该列之前存在于数据集/csv 中。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-01-15
              • 2018-03-15
              • 1970-01-01
              • 1970-01-01
              • 2019-11-16
              • 2020-08-11
              相关资源
              最近更新 更多