将数据导入每月日期时间索引

时间:2016-03-03 22:08:05

标签: python pandas

我有一个pd.dataframe,看起来像下面那个

Start Date    End Date
 1/1/1990     7/1/2014
 7/1/2005     5/1/2013
 8/1/1997     8/1/2004
 9/1/2001     

我想在datetimeindex中捕获这些数据,它显示已开始但在特定月份结束的项目数。我希望它看起来如下所示。

Date       Count
4/1/2013     3
5/1/2013     2
6/1/2013     2
7/1/2013     2

到目前为止,我创建了一个系列,创建了一个组合开始日期和结束日期的字符串,并总结了所有具有相同开始日期和结束日期的项目。

1/1/19007/1/2014  1
7/1/20055/1/2013  1  
 8/1/19978/1/2004 1
 9/1/2001         1

我有一个数据框,其datetimeindex如下所示:

4/1/2013
5/1/2013
6/1/2013
7/1/2013

现在我正努力将两者结合起来得到我正在寻找的东西。我可能正在考虑这一切都错了,并且正在寻找更好的想法。

1 个答案:

答案 0 :(得分:1)

您可以尝试:

print df1
  Start Date  End Date
0   1/1/1990  7/1/2014
1   7/1/2005  5/1/2013
2   8/1/1997  8/1/2004
3   9/1/2001       NaN

print df2
Index: [4/1/2013, 5/1/2013, 6/1/2013, 7/1/2013]

#drop NaT in columns Start Date, End Date
df1 = df1.dropna(subset=['Start Date','End Date'])

#convert columns to datetime and then to month period
df1['Start Date'] = pd.to_datetime(df1['Start Date']).dt.to_period('M')
df1['End Date'] = pd.to_datetime(df1['End Date']).dt.to_period('M')

#create new column from datetimeindex and convert it to month period
df2['Date'] = pd.DatetimeIndex(df2.index).to_period('M')
print df1
  Start Date End Date
0    1990-01  2014-07
1    2005-07  2013-05
2    1997-08  2004-08
print df2
            Date
Date            
4/1/2013 2013-04
5/1/2013 2013-05
6/1/2013 2013-06
7/1/2013 2013-07
#stack data for resampling
df1 = df1.stack().reset_index(drop=True, level=1).reset_index(name='Date')
print df1
   index    Date
0      0 1990-01
1      0 2014-07
2      1 2005-07
3      1 2013-05
4      2 1997-08
5      2 2004-08

#resample by column index
df = df1.groupby(df1['index']).apply(lambda x: x.set_index('Date').resample('1M', how='first')).reset_index(level=1)
#remove unecessary column index
df = df.drop('index', axis=1)
print df.head()
         Date
index        
0     1990-01
0     1990-02
0     1990-03
0     1990-04
0     1990-05

#merge df and df2 by column Date, groupby by Date and count
print pd.merge(df, df2, on='Date').groupby('Date')['Date'].count()
Date
2013-04    2
2013-05    2
2013-06    1
2013-07    1
Freq: M, Name: Date, dtype: int64