【问题标题】:Pandas - convert strings to time without datePandas - 将字符串转换为没有日期的时间
【发布时间】:2015-09-03 12:21:00
【问题描述】:

我已阅读大量 SO 答案,但找不到明确的解决方案。

我在一个名为 day1 的 df 中有这些数据,它代表小时数:

1    10:53
2    12:17
3    14:46
4    16:36
5    18:39
6    20:31
7    22:28
Name: time, dtype: object>

我想把它转换成时间格式。但是当我这样做时:

day1.time = pd.to_datetime(day1.time, format='H%:M%')

结果包括今天的日期:

1   2015-09-03 10:53:00
2   2015-09-03 12:17:00
3   2015-09-03 14:46:00
4   2015-09-03 16:36:00
5   2015-09-03 18:39:00
6   2015-09-03 20:31:00
7   2015-09-03 22:28:00
Name: time, dtype: datetime64[ns]>

format 参数似乎不起作用 - 如果没有日期,我如何获得此处显示的时间?


更新

以下格式正确地格式化了时间,但不知何故该列仍然是一个对象类型。为什么不转换为datetime64

day1['time'] = pd.to_datetime(day1['time'], format='%H:%M').dt.time

1    10:53:00
2    12:17:00
3    14:46:00
4    16:36:00
5    18:39:00
6    20:31:00
7    22:28:00
Name: time, dtype: object>

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    执行转换后,您可以使用日期时间访问器dt 仅访问hourtime 组件:

    In [51]:
    
    df['hour'] = pd.to_datetime(df['time'], format='%H:%M').dt.hour
    df
    Out[51]:
            time  hour
    index             
    1      10:53    10
    2      12:17    12
    3      14:46    14
    4      16:36    16
    5      18:39    18
    6      20:31    20
    7      22:28    22
    

    另外你的格式字符串H%:M% 格式不正确,它可能会引发ValueError: ':' is a bad directive in format 'H%:M%'

    关于您的最后一条评论,dtype 是 datetime.time 而不是 datetime

    In [53]:
    df['time'].iloc[0]
    
    Out[53]:
    datetime.time(10, 53)
    

    【讨论】:

      【解决方案2】:

      我最近也遇到了这个问题。我的方法接近 EdChum 的方法,结果与 YOBEN_S 的答案相同。

      就像 EdChum 说明的那样,使用 dt.hourdt.time 会给你一个 datetime.time 对象,它可能只对显示有用。我几乎无法对这些对象进行任何比较或计算。因此,如果您需要对结果列进行任何进一步的比较或计算操作,最好避免使用此类数据格式。

      我的方法只是从to_datetime 结果中减去日期:

      c = pd.Series(['10:23', '12:17', '14:46'])
      pd.to_datetime(c, format='%H:%M') - pd.to_datetime(c, format='%H:%M').dt.normalize()
      

      结果是

      0   10:23:00
      1   12:17:00
      2   14:46:00
      dtype: timedelta64[ns]
      

      dt.normalize() 基本上将所有时间分量设置为 00:00:00,它只会显示日期,同时保持datetime64 数据格式,从而可以使用它进行计算。

      我的答案绝不比其他两个好。我只是想提供一种不同的方法,希望对您有所帮助。

      【讨论】:

        【解决方案3】:

        您可以使用to_timedelta

        pd.to_timedelta(df+':00')
        Out[353]: 
        1   10:53:00
        2   12:17:00
        3   14:46:00
        4   16:36:00
        5   18:39:00
        6   20:31:00
        7   22:28:00
        Name: Time, dtype: timedelta64[ns]
        

        【讨论】:

          猜你喜欢
          • 2016-05-06
          • 2022-07-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-30
          • 1970-01-01
          • 2015-09-17
          相关资源
          最近更新 更多