【问题标题】:How to convert time of 00:00 (HH:MM) to 24:00 in pandas (python) date column?如何在熊猫(python)日期列中将 00:00(HH:MM)的时间转换为 24:00?
【发布时间】:2021-08-31 04:30:06
【问题描述】:

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

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

有谁知道在 pandas 中怎么做?

编辑: 所以我想要的是当我得到这个时间 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

就这样

【问题讨论】:

  • 这是默认的 pandas 格式...
  • 是的,但我正在做的事情是错误的
  • @mas 在下面查看我的答案
  • @mas 我为您提供了working answer。或者,如果您只需要一天进行组操作,则可以仅在时间为 '00:00:00' 的前一天保留一个 datetime 对象
  • 我还为您更新的问题提供了答案

标签: python pandas date datetime


【解决方案1】:

如果可以使用字符串,其实很简单。如果时间为'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】:

    (有点晚,但是)您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多