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']
)