Python 熊猫分类时间的格式问题

Python 熊猫分类时间的格式问题,python,pandas,dataframe,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['par

我想把小时数转换成分类格式, 该列是这样的,有数百个条目

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:只能使用具有datetimelike值的.dt访问器

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

pamdf['hr_animals'].describe()

count          139
unique         133
top       01:43:00
freq             2
Name: hr_animals, dtype: object
但每次我尝试转换时,都会出现一个新错误:

第1条

事实上,我只想把时间转换成时间。日期在另一列中。 这是一份数据集打印件,有助于理解

我怎么做

提前谢谢你,我真的很伤心

-----编辑---

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


这可能是因为您的数据不是
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<清晨我在问题中做了一些编辑!我使用了你的部分代码,但我想主要的问题是我无法转换的格式。
pd.to_datetime(pamdf['hr\u animals',format='%H:%M:%S',errors='concurve')。dt.hour
不会更改你的列。您需要将pamd['hr\u animals']=pd.分配回日期时间(…)
。但是,如果可能,请再次避免应用。
范围(24,6)
为空。查看嵌套的
如果。。elif
。它可以是
如果x是的!但我尝试了答案,得到了所有的“NaN”,该函数整夜返回。在十字架和剑之间,什么也得不到,呵呵。事实上,非常感谢你这么努力的帮助!
pd.to_datetime(pamdf['hr_animals'], format='%H:%M:%S', errors='coerce').dt.hour
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
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']
                   )