【发布时间】:2016-12-30 17:24:36
【问题描述】:
junkdf:
rev
dtime
2015-08-03 20.45
2015-08-04 -2.57
2015-08-05 12.53
2015-08-06 -8.16
2015-08-07 -4.41
junkdf.reset_index().to_dict('rec')
[{'dtime': datetime.date(2015, 8, 3), 'rev': 20.45},
{'dtime': datetime.date(2015, 8, 4), 'rev': -2.5699999999999994},
{'dtime': datetime.date(2015, 8, 5), 'rev': 12.53},
{'dtime': datetime.date(2015, 8, 6), 'rev': -8.16},
{'dtime': datetime.date(2015, 8, 7), 'rev': -4.41}]
junkdf.set_index('dtime',inplace=True)
为什么我不能像以下描述的那样进行日期时间切片:
python-pandas-dataframe-slicing-by-date-conditions
junkdf['2015-08-03':]
C:\Users\blah\Anaconda3\lib\site-packages\pandas\core\base.py in searchsorted(self, key, side, sorter)
1112 def searchsorted(self, key, side='left', sorter=None):
1113 # needs coercion on the key (DatetimeIndex does already)
-> 1114 return self.values.searchsorted(key, side=side, sorter=sorter)
1115
1116 _shared_docs['drop_duplicates'] = (
TypeError: unorderable types: datetime.date() > str()
junkdf.ix['2015-08-03':'2015-08-06']
C:\Users\blah\Anaconda3\lib\site-packages\pandas\core\base.py in searchsorted(self, key, side, sorter)
1112 def searchsorted(self, key, side='left', sorter=None):
1113 # needs coercion on the key (DatetimeIndex does already)
-> 1114 return self.values.searchsorted(key, side=side, sorter=sorter)
1115
1116 _shared_docs['drop_duplicates'] = (
TypeError: unorderable types: datetime.date() > str()
开始 = junkdf.index.searchsorted(dt.datetime(2015, 8, 4))
C:\Users\blah\Anaconda3\lib\site-packages\pandas\core\base.py in searchsorted(self, key, side, sorter)
1112 def searchsorted(self, key, side='left', sorter=None):
1113 # needs coercion on the key (DatetimeIndex does already)
-> 1114 return self.values.searchsorted(key, side=side, sorter=sorter)
1115
1116 _shared_docs['drop_duplicates'] = (
TypeError: can't compare datetime.datetime to datetime.date))
但是,如果我使用 dt.date(),则以下工作:
start = junkdf.index.searchsorted(dt.date(2015, 8, 4))
end = junkdf.index.searchsorted(dt.date(2015, 8, 6))
junkdf.ix[start:end]
rev
dtime
2015-08-04 -2.57
2015-08-05 12.53
更新:
junkdf = df[['dtime','rev']].groupby((df.dtime).dt.date).sum().copy()
df[['dtime','rev']] 的样子:
dtime rev
0 2015-08-03 07:59:59 -0.18
1 2015-08-03 08:59:59 -0.11
2 2015-08-03 09:59:59 -0.29
3 2015-08-03 10:59:59 -0.08
4 2015-08-03 11:59:59 0.69
更新 2:
我试过了:
df[['dtime','rev']].head()
dtime rev
0 2015-08-03 07:59:59 -0.18
1 2015-08-03 08:59:59 -0.11
2 2015-08-03 09:59:59 -0.29
3 2015-08-03 10:59:59 -0.08
4 2015-08-03 11:59:59 0.69
df[['dtime','rev']].groupby(pd.TimeGrouper('D', key=df.dtime)).sum()
C:\Users\blah\Anaconda3\lib\site-packages\pandas\core\generic.py in __hash__(self)
804 def __hash__(self):
805 raise TypeError('{0!r} objects are mutable, thus they cannot be'
--> 806 ' hashed'.format(self.__class__.__name__))
807
808 def __iter__(self):
TypeError: 'Series' objects are mutable, thus they cannot be hashed
【问题讨论】:
-
它适合我。
print(junkdf.index.dtype)的输出是什么? -
打印(junkdf.index.dtype)=对象
-
您的索引是字符串 dtype。您必须先将其转换为日期时间
-
所以我添加了其他信息。我通过在 datetime 列上进行 groupby 到达 junkdf。它不应该自动成为日期时间类型吗?
-
.dt.date- 将datetimedtype 转换为stringdtype
标签: datetime pandas indexing selection slice