2015-05-21 32 views
1

我有一個pandas.DataFrame對象,它由datetime索引,它是通過pandas.read_csv獲得的。數據的頻率是10分鐘。用大熊貓指定日期限制的怪異行爲

我想選擇一個時期,比如說從2014-06-15 00:00:002014-07-01 00:00:00。當我說在

a=df["2014-06-15 00:00:00":"2014-07-01 00:00:00"] 

的數據實際上開始於2014-06-15 00:10:00,而不是在2014-06-15 00:00:00。但是,如果我寫

a=df["2014-06-15 00:00":"2014-07-01 00:00"] 

(「省略」秒),然後我得到預期的行爲,這是開始2014-06-15 00:00:00數據。我錯過了什麼嗎?我正在使用熊貓版本0.16.0。

編輯

MWE數據:

a,b,c 
2014-06-14 23:10,  3.809, 103.0 
2014-06-14 23:20,  2.935, 83.0 
2014-06-14 23:30,  1.923, 73.0 
2014-06-14 23:40,  2.843, 89.0 
2014-06-14 23:50,  1.785, 125.0 
2014-06-15 00:00,  2.383, 114.0 
2014-06-15 00:10,  3.717, 94.0 
2014-06-15 00:20,  5.005, 91.0 
2014-06-15 00:30,  3.901, 97.0 
2014-06-15 00:40,  3.395, 98.0 
2014-06-15 00:50,  1.095, 36.0 
2014-06-15 01:00,  2.383, 67.0 
2014-06-15 01:10,  2.199, 98.0 
2014-06-15 01:20,  3.533, 82.0 
2014-06-15 01:30,  1.969, 81.0 
2014-06-15 01:40,  2.705, 78.0 
2014-06-15 01:50,  3.579, 52.0 
2014-06-15 02:00,  2.613, 81.0 
2014-06-15 02:10,  3.671, 71.0 
2014-06-15 02:20,  4.591, 94.0 
2014-06-15 02:30,  4.499, 84.0 
2014-06-15 02:40,  2.383, 26.0 
2014-06-15 02:50,  1.555, 86.0 
2014-06-15 03:00,  2.061, 179.0 
2014-06-15 03:10,  1.693, 299.0 
2014-06-15 03:20,  2.705, 114.0 
2014-06-15 03:30,  1.647, 104.0 
2014-06-15 03:40,  3.027, 306.0 

MWE代碼:

import pandas as pd 
df=pd.read_csv("mwe.csv", index_col=0) 
a=df["2014-06-15 00:00:00":] 
print a 

PS:我剛剛發現此代碼不會下熊貓0.14工作。

+0

您可以發佈數據和代碼來重現這個小樣本,也被你使用的是什麼版本的熊貓嗎? – EdChum

+0

您的數據是'yyyy-mm-dd hh:mm'的形式。 – farhawa

+0

抱歉,錯字。它是固定的。熊貓版本也更新(0.16)。數據應該至少在15分鐘的基礎上重現這個確切的例子,所以這不是一個好主意。我試圖在一個更小的樣本上重現這個行爲來製作一個MWE。 – TomCho

回答

1

當你解析這樣的CSV(不指定parse_dates參數):

df = pd.read_csv("mwe.csv", index_col=0) 

沒有試圖解析字符串轉換日期。所以Index的dtype爲object,索引中的值是字符串。

In [45]: df.index 
Out[45]: Index([u'2014-06-14 23:10', u'2014-06-14 23:20', u'2014-06-14 23:30', u'2014-06-14 23:40', u'2014-06-14 23:50', u'2014-06-15 00:00', u'2014-06-15 00:10', u'2014-06-15 00:20', u'2014-06-15 00:30', u'2014-06-15 00:40', u'2014-06-15 00:50', u'2014-06-15 01:00', u'2014-06-15 01:10', u'2014-06-15 01:20', u'2014-06-15 01:30', u'2014-06-15 01:40', u'2014-06-15 01:50', u'2014-06-15 02:00', u'2014-06-15 02:10', u'2014-06-15 02:20', u'2014-06-15 02:30', u'2014-06-15 02:40', u'2014-06-15 02:50', u'2014-06-15 03:00', u'2014-06-15 03:10', u'2014-06-15 03:20', u'2014-06-15 03:30', u'2014-06-15 03:40'], dtype='object') 

字符串"2014-06-15 00:00:00"適合u'2014-06-15 00:00'u'2014-06-15 00:10'因爲strings are ordered lexicographicallyu < v if u is a prefix of v之間:

In [49]: u'2014-06-15 00:00' < u"2014-06-15 00:00:00" < u'2014-06-15 00:10' 
Out[49]: True 

(在內部,該字符串被轉換爲Unicode是由比較之前。)

的方式來解決這個問題的方法是將日期類字符串解析爲實際日期:

df = pd.read_csv("mwe.csv", index_col=0) 
df.index = pd.DatetimeIndex(df.index) 

df = pd.read_csv("mwe.csv", index_col=0, parse_dates=[0]) 

然後df["2014-06-15 00:00:00":]df["2014-06-15 00:00":]都返回預期的結果:

In [57]: df["2014-06-15 00:00:00":].index[0] 
Out[57]: Timestamp('2014-06-15 00:00:00') 

In [58]: df["2014-06-15 00:00":].index[0] 
Out[58]: Timestamp('2014-06-15 00:00:00') 
+0

由於某些原因'df.index = pd.DatetimeIndex(df.index)'命令不適用於我。 – TomCho