【问题标题】:Format problem categorizing time in pandas格式问题在熊猫中分类时间
【发布时间】:2020-11-03 22:05:34
【问题描述】:

我正在尝试将小时数转换为分类格式, 该列是这样的,有数百个条目。

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

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

第 1 个。

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

第二个

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


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

第三

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

ValueError: unconverted data remains: :00 

事实是我只想转换小时。日期在另一列中。 这是数据集的打印以帮助理解。

我该怎么做?

提前谢谢,我真的很头疼

-----编辑---

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

【问题讨论】:

  • pd.to_datetime(pamdf['hr_animals'], format='%H:%M:%S', errors='coerce').dt.hour 不会更改您的列。您需要分配回pamd['hr_animals'] = pd.to_datetime(...)。但话又说回来,尽可能避免apply
  • range(24,6) 为空。查看您的嵌套if .. elif。它可以是if x &lt;=6: return 'Dawn' elif x&lt;=12: return 'Morning'。无论如何,这又是一个非常糟糕的主意:-)。
  • 是的!但是我尝试了答案并得到了所有“NaN”并且该函数整晚都返回。在十字架和剑之间,一无所获嘿嘿嘿。事实上,非常感谢您如此努力地提供帮助!

标签: python pandas dataframe


【解决方案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 &lt; Early Morning&lt;...:

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

【讨论】:

  • 我对问题进行了一些修改!我使用了你的部分代码,但我想主要问题是我无论如何都无法转换的格式。
猜你喜欢
  • 2021-02-17
  • 2019-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2021-06-17
  • 2017-05-13
相关资源
最近更新 更多