Pandas:DataFrame groupby for year / month并返回新的DatetimeIndex

时间:2016-02-18 17:54:57

标签: python pandas datetimeindex

我需要一些方向,按年或月份对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

我感谢任何指示。

2 个答案:

答案 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