对pandas中的datetime索引的算术运算

时间:2014-09-19 08:43:48

标签: python datetime pandas

在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找到了我的问题的解决方法,该问题使用基于整数位置的索引。他通过重新采样时间序列确保我有相同间隔的数据。

2 个答案:

答案 0 :(得分:4)

您的日期时间索引不是基于字符串,而是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

答案 1 :(得分:2)

Ffisegydd的previous回答非常好,只是熊猫提供了与np.timedelta64兼容的等效功能Timedelta,并且有更多的花哨功能。只需在他的示例中将timedelta(days=1)替换为pd.Timedelta(days=1)即可享受更多兼容性。