在熊猫中分类时间的格式问题

时间:2020-11-03 22:05:34

标签: python pandas dataframe

我正在尝试将小时数转换为分类格式, 该列就是这样,其中包含数百个条目。

hr_animals

21:25:00
10:36:00
23:17:00
01:23:00
NA
13:30:00
NA

我想要这样的输出:

hr_animals

Night
Morning
Night
Dawn
NA
Afternoon
NA

我正在使用以下代码对时间进行分类:

pamdf ['part_of_day'] = (pamdf['hr_animals'].dt.hour % 24 + 4) // 4
pamdf['part_of_day'].replace({1: 'Dawn',
                      2: 'Early Morning',
                      3: 'Morning',
                      4: 'Noon',
                      5: 'Evening',
                      6: 'Night'}, inplace=True)
pamdf.head()

但我仍然遇到此错误:

AttributeError: Can only use .dt accessor with datetimelike values

好的,我明白了。格式错误。当我检查列的格式是一个对象时:

pamdf['hr_animals'].describe()

count          139
unique         133
top       01:43:00
freq             2
Name: hr_animals, dtype: object

但是每次我尝试将其转换时,都会收到一个新错误:

第一。

pamdf['hr_animals'] =  pd.to_datetime(pamdf['hr_animals']

SyntaxError: unexpected EOF while parsing (<ipython-input-33-6d6f40bdc27d>, line 2) 
  File "<ipython-input-33-6d6f40bdc27d>", line 2
    pamdf['hr_animals'] =  pd.to_datetime(pamdf['hr_animals']
                                                           ^
SyntaxError: unexpected EOF while parsing

第2

pamdf['hr_animals'] = pamdf['hr_animals'].astype('datetime64[ns]')


TypeError: <class 'datetime.time'> is not convertible to datetime

3th

pamdf['hr_animals'] = pd.to_datetime(pamdf['hr_animals'], format='%H:%M').dt.hour

ValueError: unconverted data remains: :00 

事实是,我只希望将小时换算。该日期在另一列中。 这是数据集的印刷品,有助于您理解。

我该怎么办?

谢谢,我真的很伤脑筋

-----编辑---

通过使用给出的答案,我得到了:

enter image description here

1 个答案:

答案 0 :(得分:0)

这可能是因为您的数据不是datetime类型,所以您不能使用.dt访问。要修复您的代码,第三个选项应为:

pd.to_datetime(pamdf['hr_animals'], format='%H:%M:%S', errors='coerce').dt.hour

也就是说,您的格式更适合timedelta而不是DateTime。试试:

df['hr_animals'] = ((pd.to_timedelta(df['hr_animals'], errors='coerce')
                      // pd.Timedelta('4H') )
                      .add(1)
                      .replace({1: 'Dawn',
                      2: 'Early Morning',
                      3: 'Morning',
                      4: 'Noon',
                      5: 'Evening',
                      6: 'Night'})
                   )

输出:

  hr_animals
0      Night
1    Morning
2      Night
3       Dawn
4        NaN
5       Noon
6        NaN

另一种选择是使用pd.cut,它返回一个分类列。这可能会有所帮助,因为标签将被排序,即Dawn < Early Morning<...

df['hr_animals'] = pd.cut(pd.to_timedelta(df['hr_animals'], errors='coerce'),
                          bins = pd.to_timedelta(np.arange(0,25,4), unit='H'),
                          labels=['Dawn','Early Morning', 'Morning', 
                                  'Noon', 'Evening', 'Night']
                   )
相关问题