python pandas按行数切割日期时间日期

时间:2015-01-21 12:27:55

标签: python datetime pandas

假设我有时间序列

import pandas as pd
from numpy.random import randn

dates = pd.date_range('12/31/2014', periods=10)
df = pd.DataFrame(randn(10, 4), index=dates, columns=['A', 'B', 'C', 'D'])

给定d ='1/5/2015'之类的日期如何在d(天= 2015年1月6日,2015年1月7日)和d天前两天(天= 1/4 /天)后两天选择行2015年,1/3/2015)?有没有办法做到这一点,以忽略周末或假期中丢失的数据?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

from pandas.tseries.offsets import BDay

d = pd.Timestamp('1/5/2015')
two_bdays_before = d - BDay(2)   # business days
two_bdays_later = d + BDay(2)

然后访问two_bdays_beforetwo_bdays_later之间的所有日期:

>>> df[two_bdays_before:two_bdays_later]]
                   A         B         C         D
2015-01-01  0.741045 -0.051576  0.228247 -0.429165
2015-01-02 -0.312247 -0.391012 -0.256515 -0.849694
2015-01-03 -0.581522 -1.472528  0.431249  0.673033
2015-01-04 -1.408855  0.564948  1.019376  2.986657
2015-01-05 -0.566606 -0.316533  1.201412 -1.390179
2015-01-06 -0.052672  0.293277 -0.566395 -1.591686
2015-01-07 -1.669806  1.699540  0.082697 -1.229178

答案 1 :(得分:1)

df.index.get_loc(d)返回与日期字符串d表示的日期对应的整数索引。

然后,您可以使用该整数索引在d df之前或之后选择2行:

import pandas as pd
import numpy as np

dates = pd.date_range('12/31/2014', periods=10)
df = pd.DataFrame(np.random.randn(10, 4), index=dates, columns=['A', 'B', 'C', 'D'])
d = '1/5/2015'

idx = df.index.get_loc(d)
print(df.iloc[idx+1:idx+3])
#                    A         B         C         D
# 2015-01-06  1.211569  1.766432  0.153963  1.101142
# 2015-01-07  0.018377  0.112825  0.347711 -1.400145

print(df.iloc[idx-2:idx])
#                    A         B         C         D
# 2015-01-03 -0.507956 -1.389623 -0.092228 -0.104655
# 2015-01-04  0.206824  1.226987  0.253424 -0.529778