【问题标题】:Pandas dataframe indexing by datePandas 数据框按日期索引
【发布时间】:2012-12-01 15:46:45
【问题描述】:

因此,带有 pandas 模块的 Python 似乎是 matlab 和 R 的绝佳选择。这就是我最近切换到它的原因。那里有资源,我搜索了论坛但找不到类似的东西。如果您有一些教程或其他有用材料的链接,请发布它们。

Wes McKinney 有一个关于熊猫的精彩而详尽的教程。 http://www.youtube.com/watch?v=w26x-z-BdWQ&list=FLJ5xKwlfj7wg8S_A5SgR6Wg&feature=mh_lolz

在 1:10,他展示了如何按日期而不是整数索引数据框中的行的示例。 我想做类似的事情。

不同之处在于我有 3 个变量,Y1、Y2、Y3,每个变量都有一列时间戳,X1、X2、X3。

TestFile.txt:  
X1  Y1  X2  Y2  X3  Y3
27/11/2012  11.436  29/11/2012  20.631  4/12/2012   10.209  
28/11/2012  11.468  30/11/2012  20.185  5/12/2012   9.973  
29/11/2012  11.414  3/12/2012   19.962  6/12/2012   9.736  
30/11/2012  11.355  4/12/2012   19.562  7/12/2012   9.509  
3/12/2012   11.309  5/12/2012   18.908  10/12/2012  9.259  
4/12/2012   11.118  6/12/2012   18.288  11/12/2012  8.109  
5/12/2012   10.873  7/12/2012   17.973  
6/12/2012   10.582  10/12/2012  17.788  
7/12/2012   10.264  11/12/2012  17.554  
10/12/2012  9.886  
11/12/2012  9.164  

我想做 4 件事:

  1. 按 Xi 中的日期关联 Yi 中的数据,i = 1,2,3

  2. 按日期索引行

  3. 删除早于 2012 年 4 月 12 日(即 Y3 的第一个日期)的所有数据

  4. 只能按日期和列访问所有日期

这是一个测试文件,描述了如何读取数据以及如何打印数据。 您可以看到 X1 被正确解析为 pandas 日期格式,但不是 X2 或 X3。这是我试图通过指定 index_col=[0,2,4]

parse_dates = 真

TestFile.py:
import pandas as pd

df = pd.read_csv('TestFile.txt',sep='\t', index_col=[0,2,4], parse_dates = True)

print 'pandas version: ', pd.__version__
print df

给出输出:

pandas version:  0.10.0b1
X1         X2         X3              Y1      Y2      Y3                   
2012-11-27 29/11/2012 4/12/2012   11.436  20.631  10.209
2012-11-28 30/11/2012 5/12/2012   11.468  20.185   9.973
2012-11-29 3/12/2012  6/12/2012   11.414  19.962   9.736
2012-11-30 4/12/2012  7/12/2012   11.355  19.562   9.509
2012-03-12 5/12/2012  10/12/2012  11.309  18.908   9.259
2012-04-12 6/12/2012  11/12/2012  11.118  18.288   8.109
2012-05-12 7/12/2012  None        10.873  17.973     NaN
2012-06-12 10/12/2012 None        10.582  17.788     NaN
2012-07-12 11/12/2012 None        10.264  17.554     NaN
2012-10-12 None       None         9.886     NaN     NaN
2012-11-12 None       None         9.164     NaN     NaN

想要的输出:

                Y1      Y2       Y3                 
2012-04-12  11.118  19.562   10.209
2012-05-12  10.873  18.908    9.973
2012-06-12  10.582  18.288    9.736
2012-07-12  10.264  17.973    9.509
2012-10-12   9.886  17.788    9.259
2012-11-12   9.164  17.554    8.109

如果您对如何执行此操作有任何想法,非常感谢您的帮助:)

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    我认为您的困惑是由于对 index_col 参数的误解。当您将列列表传递给index_col 时,pandas 正在尝试创建多索引,即具有多个列作为索引的数据框,就像多维表一样。它不是试图通过连接多个列来创建单个索引。

    一种可行的策略是使用输入文件中的适当列对创建三个数据框,然后将它们连接起来。

    X1 Y1 X2 Y2 X3 Y3 --> (X1, Y1) 数据帧 + (X2, Y2) 数据帧 + (X3, Y3) 数据帧

    如果您正在使用或愿意使用 Pandas 的最新开发版本,则可以使用 read_csv() 中的新 parse_cols 参数来简化此操作。或者您可以读入所有数据,提取您需要的三个数据帧,然后将它们连接起来。

    最后,您可以使用df.truncatebeforeafter 参数来获得所需的日期范围。更简单地说,您可以使用dropna() 省略缺少值的日期。

    希望这会有所帮助。请告诉我们您使用的是什么版本的 pandas。

    【讨论】:

    • 所以这行得通: df1 = pd.read_csv('TestFile.txt',sep='\t', index_col = 0,parse_dates = True, usecols = [0,1]) 这拉第二个系列的正确日期,但不解析日期: df2 = pd.read_csv('TestFile.txt',sep='\t', index_col = 0,parse_dates = True, usecols = [2,3])
    • 如果您在与read_csv() 相同的步骤中解析日期时遇到问题,请不要担心 - 只需将日期读取为字符串即可。将数据连接到一个 df 后,然后从包含日期字符串的列创建日期时间索引。
    【解决方案2】:

    通过设置index_col=[0,2,4],您正在创建一个MultiIndex,这就是您获得该输出的原因。

    对于您想要的输出, read_csv 将无法即时执行此操作。只需读取单个并合并数据框

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-20
      • 2019-03-16
      • 2014-01-30
      • 2021-08-14
      • 2018-07-31
      • 1970-01-01
      相关资源
      最近更新 更多