python pandas时间序列选择一年中的一天

时间:2015-05-23 14:13:45

标签: python date pandas dataframe

我想在一年中的特定日期从数据框中选择数据。这是我迄今为止最简单的例子。

import pandas as pd
from datetime import datetime 
from datetime import timedelta
import numpy.random as npr 
rng = pd.date_range('1/1/1990', periods=365*10, freq='D')
df1 = pd.DataFrame(npr.randn(len(rng)), index=rng)
print df1

这会产生:

                   0
1990-01-01 -0.032601
1990-01-02 -0.496401
1990-01-03  0.444490

等。 现在我列出一些我想要提取的日期。我之前在熊猫中使用过这个,但我怀疑这不是获取特定日期值的最佳方法。无论如何,

td = timedelta(days=31)
dr = pd.date_range(datetime(1990,12,31)+td,datetime(2000,12,31),
                    freq=pd.DateOffset(months=12, days=0))
print dr

这当然会产生:

DatetimeIndex(['1991-01-31', '1992-01-31', '1993-01-31', '1994-01-31',
               '1995-01-31', '1996-01-31', '1997-01-31', '1998-01-31',
               '1999-01-31', '2000-01-31'],
dtype='datetime64[ns]', freq='<DateOffset: kwds={'months': 12, 'days': 0}>', tz=None)

当我尝试按日期列表对数据帧进行切片时,我会生成错误:

monthly_df1 = df1[dr]

输出:

KeyError: "['1991-01-30T16:00:00.000000000-0800' '1992-01-30T16:00:00.000000000-0800'\n 
'1993-01-30T16:00:00.000000000-0800' '1994-01-30T16:00:00.000000000-0800'\n 
'1995-01-30T16:00:00.000000000-0800' '1996-01-30T16:00:00.000000000-0800'\n 
'1997-01-30T16:00:00.000000000-0800' '1998-01-30T16:00:00.000000000-0800'\n 
'1999-01-30T16:00:00.000000000-0800' '2000-01-30T16:00:00.000000000-0800'] 
not in index"

我认为我在这里有两个基本问题:(1)有更好的方法来提取特定日期的年度数据; (2)dataframe和date_range列表中的时间序列是不同的。我很感激有关这两个问题的信息。谢谢,社区。

2 个答案:

答案 0 :(得分:3)

您可以使用.ix来过滤dr

中的df1个日期
In [107]: df1.ix[dr]
Out[107]:
                   0
1991-01-31 -1.239096
1992-01-31  0.153730
1993-01-31 -0.685778
1994-01-31  0.132170
1995-01-31  0.154965
1996-01-31  1.800437
1997-01-31  2.725209
1998-01-31 -0.084751
1999-01-31  1.604511
2000-01-31       NaN

即使df1.loc[dr]也有效。

此外,对于这种情况,您可以通过这些条件来提取日期

In [108]: df1[(df1.index.month==1) & (df1.index.day==31)]
Out[108]:
                   0
1990-01-31 -0.362652
1991-01-31 -1.239096
1992-01-31  0.153730
1993-01-31 -0.685778
1994-01-31  0.132170
1995-01-31  0.154965
1996-01-31  1.800437
1997-01-31  2.725209
1998-01-31 -0.084751
1999-01-31  1.604511

答案 1 :(得分:1)

您可以使用的最简单的方法是使用部分字符串索引获取年份数据,然后每年resample

df1['1990-12-31':].resample('A', how='first')

字符串切片在17.4.1 DatetimeIndex Partial String Indexing下的pandas文档中描述。使用此方法,您可以删除timedelta的创建,第二个date_range以及复杂和错误的切片。重新采样方法是标准的,使用&#39; A&#39;作为&#34;年度&#34;的指示符频率以及如何=&#39; first&#39;只需抓住第一个匹配的项目。

            0
1990-12-31 -0.600904
1991-12-31 -1.083462
1992-12-31  0.469949
1993-12-31 -0.809852
1994-12-31 -0.165877
1995-12-31  1.460035
1996-12-31 -0.332960
1997-12-31 -0.140873
1998-12-31  1.088687
1999-12-31  0.190218

Check out the pandas documentation,查看17.4.1 DatetimeIndex部分字符串索引 Here is the TimeSeries documentation mentioning resampling 最后,the API doc for the resample()方法