我需要一些方向,按年或月份对Pandas DateFrame
对象进行分组,然后返回一个带有新索引的新DateFrame
对象。
到目前为止,这是我的代码。 groupby
按预期工作。
从.csv文件加载数据,解析'日期'迄今为止的格式(来自finance.yahoo.com的历史股票报价)
In [23]: import pandas as pd
file = pd.read_csv("sdf.de.csv", parse_dates=['Date'])
file.head(2)
Out[23]:
Date Open High Low Close Volume Adj Close
0 2016-02-16 18.650 18.70 17.940 18.16 1720800 17.0600
1 2016-02-15 18.295 18.64 18.065 18.50 1463500 17.3794
排序文件'日期'升序并将索引设置为Date
In [24]: daily = file.sort_values(by='Date').set_index('Date')
daily.head()
Out[24]:
Open High Low Close Volume Adj Close
Date
2000-01-03 14.20 14.50 14.15 14.40 277400 2.7916
2000-01-04 14.29 14.30 13.90 14.15 109200 2.7431
分组月份
我会对这些组执行额外的apply()
,这会压缩特定组的数据,例如:找到年/月的最高High
值或sum()
Volume
值。此示例省略了此步骤。
In [39]: monthly = daily.groupby(lambda x: (x.year, x.month))
monthly.first()
Out[39]:
Open High Low Close Volume Adj Close
(2000, 1) 14.200 14.500 14.150 14.400 277400 2.7916
(2000, 2) 13.900 14.390 13.900 14.250 287200 2.7625
... ... ... ... ... ... ...
(2016, 1) 23.620 23.620 23.620 23.620 0 22.1893
(2016, 2) 19.575 19.630 19.140 19.450 1783000 18.2719
这样可行,但它给了我一个以元组为索引的DateFrame
对象。
所需的结果(在本例中为月份分组)将是一个完整的新DataFrame
对象,但Date
索引应为DatetimeIndex
形式的新%Y-%m
1}}或仅%Y
如果按年份分组。
Out[39]:
Open High Low Close Volume Adj Close
Date
2000-01 14.200 14.500 14.150 14.400 277400 2.7916
2000-02 13.900 14.390 13.900 14.250 287200 2.7625
... ... ... ... ... ... ...
2016-01 23.620 23.620 23.620 23.620 0 22.1893
2016-02 19.575 19.630 19.140 19.450 1783000 18.2719
我感谢任何指示。
答案 0 :(得分:2)
您可以daily.index.year, daily.index.month
使用index
或更改index
groupby
,然后print daily
Open High Low Close Volume Adj Close
Date
2000-01-01 14.200 14.50 14.15 14.40 277400 2.7916
2000-02-01 13.900 14.39 13.90 14.25 287200 2.7625
2016-01-01 23.620 23.62 23.62 23.62 0 22.1893
2016-02-01 19.575 19.63 19.14 19.45 1783000 18.2719
print daily.groupby([daily.index.year, daily.index.month]).first()
Open High Low Close Volume Adj Close
2000 1 14.200 14.50 14.15 14.40 277400 2.7916
2 13.900 14.39 13.90 14.25 287200 2.7625
2016 1 23.620 23.62 23.62 23.62 0 22.1893
2 19.575 19.63 19.14 19.45 1783000 18.2719
daily.index = daily.index.to_period('M')
print daily.groupby(daily.index).first()
Open High Low Close Volume Adj Close
Date
2000-01 14.200 14.50 14.15 14.40 277400 2.7916
2000-02 13.900 14.39 13.90 14.25 287200 2.7625
2016-01 23.620 23.62 23.62 23.62 0 22.1893
2016-02 19.575 19.63 19.14 19.45 1783000 18.2719
更改angular
.module('app', [])
.directive('compileExample', compileExample);
function compileExample() {
return {
restrict: 'E',
scope: {},
compile: function(tElement, tAttrs) {
angular.element(tElement).append("My name is {{name}}");
},
controller: function($scope, $element) {
$scope.name = "Liam";
},
}
}
:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="utf-8">
<title>controllerVsLink</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
<script src="main.js"></script>
</head>
<body ng-app="app">
<compile-Example></compile-Example>
</body>
</html>
答案 1 :(得分:1)
您可以使用列表推导从时间戳访问年份和月份访问者变量,然后对这些变量进行分组。
>>> df.groupby([[d.year for d in df.Date], [d.month for d in df.Date]]).first()
Date Open High Low Close Volume Adj_Close
2000 1 2000-01-01 14.200 14.50 14.15 14.40 277400 2.7916
2 2000-02-01 13.900 14.39 13.90 14.25 287200 2.7625
2016 1 2016-01-01 23.620 23.62 23.62 23.62 0 22.1893
2 2016-02-01 19.575 19.63 19.14 19.45 1783000 18.2719