【问题标题】:Converting Pandas Dataframe column object in MM:SS format to Datetime type?将 MM:SS 格式的 Pandas Dataframe 列对象转换为 Datetime 类型?
【发布时间】:2022-01-18 18:17:15
【问题描述】:
0                18:30
1                24:50
2                33:21
3                28:39
4                27:30
5                21:26
6                16:42
7                16:48
8                26:07
9                18:13
10               27:15
11               24:33
12               29:43
13               NaN
14               NaN
15               NaN
16               24:58
17               26:14
18               27:36
19               33:27
Name: Minutes, dtype: object

我有一个名为Minutes 的列,它表示执行一项任务所花费的分钟数。该列采用MM:SS 格式,没有毫秒或小时。对于那些没有执行任务的人,有一些Null 值,我想用00:00 替换它们。我尝试使用

将该列转换为datetime
df['Minutes'] = df['Minutes'].apply(pd.to_datetime, format = '%M:%S', errors='coerce')

这给了我

1       1900-01-01 00:24:50
2       1900-01-01 00:33:21
3       1900-01-01 00:28:39
4       1900-01-01 00:27:30
5       1900-01-01 00:21:26

我想这很好,但我的目标是能够通过花费在任务上的最多时间对这些列执行排序。在我应用pd.to_datetime 之后,该列的数据类型仍然是一个对象。当我尝试排序时,我面临:

KeyError Traceback(最近一次调用最后一次) 在 ----> 1 df.sort_values(by=df['Minutes'], 升序=True) ~\anaconda3\lib\site-packages\pandas\core\frame.py 在 sort_values(self,by,axis,ascending,inplace,kind,na_position,ignore_index,key) 5453 5454 由 = 由 [0] -> 5455 k = self._get_label_or_level_values(按,轴=轴) 5456 5457 # 需要重新包装系列中的列以应用键功能 ~\anaconda3\lib\site-packages\pandas\core\generic.py in _get_label_or_level_values(self, key, axis) 1682 值 = self.axes[轴].get_level_values(key)._values 1683 其他: -> 1684 引发 KeyError(键) 1685 第1686章

【问题讨论】:

    标签: python pandas dataframe datetime timedelta


    【解决方案1】:

    使用替换 NaN 值

    df.fillna('00:00')
    

    接着是:

    df['Minutes'] = pd.to_datetime(df['Minutes'], format='%M:%S', errors='coerce')  
    

    接着是:

    df.sort_values('Minutes')  #Note Ascending is default
    

    【讨论】:

    • 不,它们被转换为 NAT 的
    • 谢谢!这适用于排序问题。唯一的问题是如何在不更改 dtype 的情况下将其变为 MM:SS 格式?现在它显示为 '1900-01-01 00:18:30' 我希望它只是 18:30 或 00:18:30。
    • 最简单的方法是不将 Minutes 列转换为 datetimestamp。所以你会有两行:df.fillna('00:00')df.sort_values('Minutes')
    • 如果你说持续时间为零或者你说持续时间未知(这里的 NaN 是什么意思),那是不一样的。而且我认为你不应该将未知持续时间设置为零,只是为了让一些代码以某种方式工作。所以,我认为 NaT 在这种情况下是你想要的。顺便说一句,排序工作得很好。
    • @MrFuppes,操作员说“对于那些没有执行任务的人有一些 Null 值,我想用 00:00 替换”,因此我给出了答案,而不是使用 NAT
    【解决方案2】:

    pd.to_datetime 和关键字 errors='coerce' 负责处理 NaN,它将在未知的持续时间内离开 NaT(不是一个时间)。

    另外请注意,对于排序,您实际上根本不需要转换为日期时间。

    import pandas as  pd
    # >>> pd.__version__
    # 1.3.5
    import numpy as np
    
    df = pd.DataFrame({'Minutes': ["27:15", "24:33", "29:43", "NaN", np.NaN, None]})
    
    # you can do a df.sort_values('Minutes') here already!
    
    df['Minutes'] = pd.to_datetime(df['Minutes'], format='%M:%S', errors='coerce')
    df = df.sort_values('Minutes')
    
    # df['Minutes']
    # 1   1900-01-01 00:24:33
    # 0   1900-01-01 00:27:15
    # 2   1900-01-01 00:29:43
    # 3                   NaT
    # 4                   NaT
    # 5                   NaT
    # Name: Minutes, dtype: datetime64[ns]
    

    要更改格式,您需要转换回字符串:

    df['Minutes'].dt.strftime('%H:%M:%S')
    # 1    00:24:33
    # 0    00:27:15
    # 2    00:29:43
    # 3         NaN
    # 4         NaN
    # 5         NaN
    # Name: Minutes, dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2015-03-23
      • 2018-01-18
      • 2020-08-11
      • 2017-01-08
      • 2016-09-24
      • 2022-01-15
      相关资源
      最近更新 更多