【问题标题】:Reset time part of a pandas timestamp重置熊猫时间戳的时间部分
【发布时间】:2015-01-09 00:59:13
【问题描述】:

如何重置 pandas 时间戳的时间部分?

我想重置 pandas.Timestamp 值中的时间部分。
我想我可以使用以下过程来做到这一点。

  • 步骤 1) 时间戳到日期时间类型
  • 步骤 2) 日期时间到秒
  • 步骤 3) 以秒为单位截断时间部分
  • 第 4 步)将秒数恢复到时间戳

即使我的猜测是正确的,也需要很长时间才能完成。 有没有直接的方法来实现这个目标?

在 [371] 中:ts = pd.Timestamp('2014/11/12 13:35')

在 [372] 中:ts

输出[372]:时间戳('2014-11-12 13:35:00')

在 [373]: ts.hour = 0 #

【问题讨论】:

  • 如果您正在处理DatetimeIndex,您可以使用normalize 方法。然而,这在单个时间戳上不可用(解决方法是:pd.DatetimeIndex([ts]).normalize()[0]
  • 您想重置“整个”时间部分(仅保留日期),还是只想重置小时数?

标签: python datetime pandas timestamp


【解决方案1】:

不要使用datetime.datetime,而是使用datetime.date,它会自动为您截断小时/分钟/秒。

https://docs.python.org/library/datetime.html#date-objects

【讨论】:

    【解决方案2】:

    我认为您正在寻找replace 方法(请参阅docs):

    In [18]: ts
    Out[18]: Timestamp('2014-11-12 13:35:00')
    
    In [19]: ts.replace(hour=0)
    Out[19]: Timestamp('2014-11-12 00:35:00')
    

    这是一个继承自datetime.datetime的方法

    如果要重置全职部分,请在replace中指定所有部分:

    In [20]: ts.replace(hour=0, minute=0, second=0)
    Out[20]: Timestamp('2014-11-12 00:00:00')
    

    还有一个 DatetimeIndex.normalize 方法,但这在单个时间戳上不可用(我为此打开了一个问题:https://github.com/pydata/pandas/issues/8794):

    In [21]: pd.DatetimeIndex([ts]).normalize()[0]
    Out[21]: Timestamp('2014-11-12 00:00:00')
    

    【讨论】:

    • 这里最有价值的东西,pandas时间戳是继承自datetime!!!如果我知道这一点,我就不会那么害怕了。 :) 谢谢!
    • replace 方法似乎不适用于列,是吗? AttributeError: 'DatetimeProperties' object has no attribute 'replace'
    • 确实,这在列/索引上不可用。在这种情况下,如果您想使用replace,则需要使用df["col"].apply(lambda ts: ts.replace(..)) 之类的东西(但请注意,normalize 在列上可用)。
    【解决方案3】:
    pd.Timestamp('2014-11-12 13:35') - pd.offsets.Micro(0, normalize=True) == Timestamp('2014-11-12 00:00:00')
    

    【讨论】:

      【解决方案4】:

      注意replace方法不会改变Timestamp,所以如果你想保留修改后的Timestamp你必须分配:

      In [2]: ts = pd.Timestamp('2014/11/12 13:35')
      In [3]: ts.replace(hour=0)
      Out[3]: Timestamp('2014-11-12 00:35:00')
      In [4]: ts
      Out[4]: Timestamp('2014-11-12 13:35:00')
      

      注意:上面代码中没有修改ts。

      In [5]: ts = ts.replace(hour=0)
      In [6]: ts
      Out[6]: Timestamp('2014-11-12 00:35:00')
      

      【讨论】:

        【解决方案5】:

        我推荐使用:

        pd.Timestamp('2014-11-12 13:35')-pd.Timedelta(f"{pd.Timestamp('2014-11-12 13:35').hour} hours")
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-23
          • 2019-06-08
          • 2020-12-06
          • 2013-02-03
          • 1970-01-01
          • 2021-12-19
          • 2019-06-16
          • 2019-07-19
          相关资源
          最近更新 更多