代码之家  ›  专栏  ›  技术社区  ›  mas

如何将pandas(python)日期列中的00:00(HH:MM)时间转换为24:00?

  •  1
  • mas  · 技术社区  · 3 年前

    我有一个csv文件的日期时间列。我使用 pandas.read_csv(file, index_col="Date", parse_date=True) 以读取csv。datetime列具有30min freq/res,因此给定日期的第一个时间为 00:30:00 ,但最后一次不是我想要的:

    enter image description here

    如您所见,给定日期的时间00:00:00(此处 2015-12-01 )被解释为第二天。 我找不到解决这个问题的方法。在本例中,我希望: 2015-12-02 00:00:00 被解释为 205-12-01 24:00:00 或者指正确日期的东西。

    有人知道如何在熊猫身上活动吗?

    编辑 所以我想要的是,当我得到这个时间的日期00:00:00时,它会给我昨天的日期(所以它认为时间是23:59:59): 我想要这个:

    2015-12-01 23:00:00    Tuesday  2015-12-01
    2015-12-01 23:30:00    Tuesday  2015-12-01
    2015-12-02 00:00:00  Wednesday  2015-12-02
    2015-12-02 00:30:00  Wednesday  2015-12-02
    

    是这样的:

    2015-12-01 23:00:00    Tuesday  2015-12-01
    2015-12-01 23:30:00    Tuesday  2015-12-01
    2015-12-01 23:59:59    Tuesday  2015-12-01
    2015-12-02 00:30:00  Wednesday  2015-12-02
    

    是这个吗

    0 回复  |  直到 3 年前
        1
  •  2
  •   mozway    3 年前

    如果你能使用字符串,这其实很简单。如果时间为“00:00:00”,则减去一天,转换为字符串,将“00:00:00”替换为“24:00:00”。

    import datetime
    s = pd.Series(['2015-12-01 23:00:00', '2015-12-01 00:00:00'])
    s = pd.to_datetime(s)
    s.where(s.dt.time != datetime.time(0),
            ((s-pd.to_timedelta('1day'))
             .dt.strftime('%Y-%m-%d %H:%M:%S')
             .str.replace('00:00:00', '24:00:00')
            )
           )
    
    

    输出

    0    2015-12-01 23:00:00
    1    2015-11-30 24:00:00
    

    或者,对于您的编辑:

    df['col1'] = pd.to_datetime(df['col1'])
    df['col1'] = df['col1'].where(df['col1'].dt.time != datetime.time(0),
                                  (df['col1']-pd.to_timedelta('1s'))
                                 )
    df['col2'] = df['col1'].dt.day_name()
    df['col3'] = df['col1'].dt.date
    

    输出

                     col1       col2        col3
    0 2015-12-01 23:00:00    Tuesday  2015-12-01
    1 2015-12-01 23:30:00    Tuesday  2015-12-01
    2 2015-12-01 23:59:59    Tuesday  2015-12-01
    3 2015-12-02 00:30:00  Wednesday  2015-12-02
    
        2
  •  1
  •   Corralien    3 年前

    (有点晚了,但是)你可以用 dt.normalize 以查找要修改的值,并减去一秒钟,然后根据DateTime列更改其他列。

    输入数据:

    >>> df
                 DateTime  DayOfWeek       Date
    0 2015-12-01 23:00:00    Tuesday 2015-12-01
    1 2015-12-01 23:30:00    Tuesday 2015-12-01
    2 2015-12-02 00:00:00  Wednesday 2015-12-02
    3 2015-12-02 00:30:00  Wednesday 2015-12-02
    
    >>> df.dtypes
    DateTime     datetime64[ns]
    DayOfWeek            object
    Date         datetime64[ns]
    
    new = df.loc[df['DateTime'].eq(df['DateTime'].dt.normalize()), ['DateTime']] \
            .sub(pd.DateOffset(seconds=1))
    
    new = new.assign(DayOfWeek=new['DateTime'].dt.day_name(), 
                     Date=new['DateTime'].dt.normalize())
    
    df.update(new)
    

    输出结果:

    >>> df
                 DateTime  DayOfWeek       Date
    0 2015-12-01 23:00:00    Tuesday 2015-12-01
    1 2015-12-01 23:30:00    Tuesday 2015-12-01
    2 2015-12-01 23:59:59    Tuesday 2015-12-01
    3 2015-12-02 00:30:00  Wednesday 2015-12-02
    4 2021-08-30 23:59:59     Monday 2021-08-30