我的多索引数据框如下:
df.head()
Output
Unit Timestamp
1 2016-06-01 00:00:00 225894.9
2016-06-01 01:00:00 225895.9
2016-06-01 02:00:00 225896.9
2016-06-01 03:00:00 225897.9
2016-06-01 04:00:00 225898.9
df.tail()
Output
Unit Timestamp
16 2016-06-30 18:00:00 150543.1
2016-06-30 19:00:00 150544.1
2016-06-30 21:00:00 150546.1
2016-06-30 22:00:00 150547.1
2016-06-30 23:00:00 150548.1
也就是说,一个月的每小时数据可用于16个单位。
我想挑选给定单位的一天数据。我有一系列出现在数据框中的日期,
days = array([datetime.date(2016, 6, 1), datetime.date(2016, 6, 2), datetime.date(2016, 6, 3), datetime.date(2016, 6, 4),...
等
如果我这样做了df.ix[5,'2016-06-10']
,我就会得到我想要的东西,那就是该日期第5单元的日期
Output
Timestamp
2016-06-10 00:00:00 152364.6
2016-06-10 01:00:00 152365.7
2016-06-10 02:00:00 152366.6
...
2016-06-10 21:00:00 152386.6
2016-06-10 22:00:00 152386.6
2016-06-10 23:00:00 152387.6
但是当我有一个datetime.date对象而不是一个字符串时,相同的索引似乎不起作用。例如:
tenth = days[9]
撤消至datetime.date(2016, 6, 10)
,到目前为止效果良好。
但是,当我这样做时,会df.ix[5,tenth]
收到“ KeyError:您没有名为2016-06-10的商品”
因此,'2016-06-10'
“按我的意思做”并返回当天的所有数据。如果使用datetime.date,我该怎么做?
当您将看起来像日期时间的字符串传递给pandas选择器时ix
,它将像条件一样使用它并返回所有满足条件的元素。在这种情况下,您使用的字符串将计算为一天。熊猫运行ix
并返回当天的所有行。传递datetime对象时,它会寻找完全匹配的对象。您没有一个,因为您所有的日期时间都不是零时。
考虑:
s = pd.Series(range(5), pd.date_range('2016-03-31 01:00:00', periods=5, freq='H'))
s
2016-03-31 01:00:00 0
2016-03-31 02:00:00 1
2016-03-31 03:00:00 2
2016-03-31 04:00:00 3
2016-03-31 05:00:00 4
Freq: H, dtype: int64
获取所有元素 '2016-03-31'
s.ix['2016-03-31']
2016-03-31 01:00:00 0
2016-03-31 02:00:00 1
2016-03-31 03:00:00 2
2016-03-31 04:00:00 3
2016-03-31 05:00:00 4
Freq: H, dtype: int64
现在分配一个日期时间
date = pd.to_datetime('2016-03-31')
s.ix[date]
和...
KeyError: Timestamp('2016-03-31 00:00:00')
相反,如果我们分配了一个确实匹配的日期时间,那么我们应该得到一个结果。
date2 = pd.to_datetime('2016-03-31 02:00:00')
然后
s.ix[date2]
返回值:
1
奏效了!
要使用日期时间并使它看起来很漂亮,请使用以下函数:
d2s = lambda d: d.strftime('%Y-%d-%m')
然后
s.ix[d2s(date)]
2016-03-31 01:00:00 0
2016-03-31 02:00:00 1
2016-03-31 03:00:00 2
2016-03-31 04:00:00 3
2016-03-31 05:00:00 4
Freq: H, dtype: int64
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句