【问题标题】:Arithmetic operations on datetime index in pandaspandas中日期时间索引的算术运算
【发布时间】:2014-09-19 08:43:48
【问题描述】:

在 pandas 中,您可以通过经典的基于整数位置/行的索引或基于日期时间的索引来访问时间序列的特定位置。可以使用基本算术运算来操作基于整数的索引,例如如果我有一个频率为 12 小时的时间序列的 integer_index,并且我想在此之前的一天访问该条目,我可以简单地执行 integer_index - 2。然而,现实世界的数据并不总是完美的,有时会丢失行。在这种情况下,此方法会失败,如果能够使用基于日期时间的索引并从此索引中减去 one day,将会很有帮助。我该怎么做?

示例脚本:

# generate a sample time series
import pandas as pd
s = pd.Series(["A", "B", "C", "D", "E"], index=pd.date_range("2000-01-01", periods=5, freq="12h"))
print s

2000-01-01 00:00:00    A
2000-01-01 12:00:00    B
2000-01-02 00:00:00    C
2000-01-02 12:00:00    D
2000-01-03 00:00:00    E
Freq: 12H, dtype: object

# these to indices should access the same value ("C")
integer_index = 2
date_index = "2000-01-02 00:00"

print s[integer_index]  # prints "C"
print s[date_index]  # prints "C"

# I can access the value one day earlier by subtracting 2 from the integer index
print s[integer_index - 2]  # prints A

# how can I subtract one day from the date index?
print s[date_index - 1]  # raises an error 

这个问题的背景可以在我之前提交的这里找到:

Fill data gaps with average of data from adjacent days

用户 JohnE 在哪里找到了解决我的问题的方法,该方法使用基于整数位置的索引。他通过重新采样时间序列来确保我拥有等距的数据。

【问题讨论】:

    标签: python datetime pandas


    【解决方案1】:

    您的日期时间索引不是基于字符串,它是一个DatetimeIndex,这意味着您可以使用datetime 对象进行适当的索引,而不是一个看起来 像日期的字符串。

    下面的代码将date_index 转换为datetime 对象,然后使用timedelta(days=1) 从中减去“一天”。

    # generate a sample time series
    import pandas as pd
    from datetime import datetime, timedelta
    
    s = pd.Series(["A", "B", "C", "D", "E"], index=pd.date_range("2000-01-01", periods=5, freq="12h"))
    print(s)
    
    # these two indices should access the same value ("C")
    integer_index = 2
    # Converts the string into a datetime object
    date_index = datetime.strptime("2000-01-02 00:00", "%Y-%m-%d %H:%M")
    print(date_index) # 2000-01-02 00:00:00
    
    print(s[integer_index])  # prints "C"
    print(s[date_index])  # prints "C"
    
    
    print(s[integer_index - 2])  # prints "A"
    
    one_day = timedelta(days=1)
    print(s[date_index - one_day]) # prints "A"
    print(date_index - one_day) # 2000-01-01 00:00:00
    

    【讨论】:

      【解决方案2】:

      Ffisegydd 的previous 答案非常好,除了pandas 提供了与np.timedelta64 兼容的等效函数Timedelta 并且有更多的花里胡哨。只需在他的示例中将 timedelta(days=1) 替换为 pd.Timedelta(days=1) 即可享受更多兼容性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-04
        • 2018-02-18
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-31
        • 2014-07-17
        相关资源
        最近更新 更多