Pandas.DataFrame - 查找值可用的最早日期

时间:2016-01-24 14:19:29

标签: python pandas dataframe time-series series

我有一个包含2个时间序列的pandas.DataFrame对象。一个系列比另一个系列短得多。

我想确定最短系列中数据可用的更远日期,并在该日期之前删除2列中的数据。

最狡猾的方式是什么?

(我很抱歉我并没有真正遵循提交问题的SO指南)

以下是我的数据框的一个片段:

            osr       go
Date        
1990-08-17  NaN     239.75
1990-08-20  NaN     251.50
1990-08-21  352.00  265.00
1990-08-22  353.25  274.25
1990-08-23  351.75  290.25

在这种情况下,我希望在1990-08-21之前删除所有行(我添加了其中一个列中可能有更新日期的NAs)

2 个答案:

答案 0 :(得分:2)

您可以在s的倒置df['osr'][::-1]中使用idxmax,然后使用df的子集:

print df
#               osr      go
#Date                      
#1990-08-17     NaN  239.75
#1990-08-20     NaN  251.50
#1990-08-21  352.00  265.00
#1990-08-22  353.25  274.25
#1990-08-23  351.75  290.25

s = df['osr'][::-1]
print s
#Date
#1990-08-23    351.75
#1990-08-22    353.25
#1990-08-21    352.00
#1990-08-20       NaN
#1990-08-17       NaN
#Name: osr, dtype: float64

maxnull = s.isnull().idxmax()
print maxnull
#1990-08-20 00:00:00

print df[df.index > maxnull]
#               osr      go
#Date                      
#1990-08-21  352.00  265.00
#1990-08-22  353.25  274.25
#1990-08-23  351.75  290.25

答案 1 :(得分:1)

编辑:基于评论/修改的新答案

这听起来像数据是连续的,一旦你有没有数据的行你想要抛出它们。这可以通过dropna轻松完成。

df = df.dropna()

这个答案假设一旦你通过坏行,他们就会保持良好状态。或者,如果你不关心在中间删除行...取决于你需要的顺序。如果数据需要是连续的并且您的输入结构良好,以色列的答案是好的

原始回答

你的数据框架中没有给出太多结构,所以我将在这里做出假设。我假设您有很多列,其中两个:time_series_1time_series_2是您在问题中提到的列,这些列都存储在df

首先,我们只需使用

即可找到较短的系列
shorter_col = df['time_series_1'] if len(df['time_series_1']) > len(df['time_series_2']) else df['time_series_2']

现在我们想要那个

中的最后一个日期
remove_date = max(shorter_col)

现在我们要在该日期之前删除数据

mask = (df['time_series_1'] > remove_date) | (df['time_series_2'] > remove_date)
df = df[mask]