我正在尝试将小时数转换为分类格式, 该列就是这样,其中包含数百个条目。
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
事实是,我只希望将小时换算。该日期在另一列中。 这是数据集的印刷品,有助于您理解。
我该怎么办?
谢谢,我真的很伤脑筋
-----编辑---
通过使用给出的答案,我得到了:
答案 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']
)