【问题标题】:Python pandas resample method doubles dataframe rowsPython pandas resample 方法将数据帧行加倍
【发布时间】:2018-07-06 06:44:15
【问题描述】:

我已将 csv 文件读入如下所示的数据框:

                     Datetime   Value
    0     2017-01-04 00:00:00   0.00
    1     2017-01-04 00:15:00   2.00
    2     2017-01-04 00:30:00   2.00
    3     2017-01-04 00:45:00   1.00
    4     2017-01-04 01:00:00   3.00
    ...
    15542 2017-09-09 23:45:00   8.00

    [15542 rows x 2 columns]

由于测量失败,缺少一些日期时间。所以我用 resample("15min").mean().fillna(0)

就目前而言,缺失的空白已被填补,但不知何故,新的数据框并不完整 - 确切地说 - 不包括超过某个日期时间的行(8 月 12 日之后的所有数据),令我惊讶的是,这些行更多比翻倍:

                     Datetime   Value
    0     2017-01-04 00:00:00   0.00
    1     2017-01-04 00:15:00   2.00
    2     2017-01-04 00:30:00   2.00
    32543 2017-12-08 23:45:00   0.00

    [32544 rows x 2 columns]

我的目标只是读取 csv,填补缺少的日期时间空白,并将值设置为 0.00,其中日期时间已完成。在这种特殊情况下,这应该会导致 [15552 x 2 columns](注释:需要添加 10 个日期时间/值)。

代码如下:

    import pandas as pd

    def read_csv():
        for filename in path:
        file_list.append(filename)
        print(file_list)
        dfs = [pd.read_csv(filename, sep=',', parse_dates=[1], decimal='.', 
                           names=headers)for filename in path]
        df = pd.concat(dfs)
        df_new = df.set_index('Datetime').resample('15 min').mean().fillna(0).reset_index()

        print(df_new)

想到了重新索引的问题,但无法解决。 提前致谢。

【问题讨论】:

  • 2017-12-08 12 月 8 日不是 8 月 12 日吗?但无论哪种方式,似乎都是数据问题。我会仔细检查您的索引是否是所有日期,而不是字符串和日期的混合。您也可以尝试asfreq,但我认为resample 很好,只是您遇到了某种数据问题。
  • 如果您可以使用示例数据集重现错误(而不仅仅是粘贴输出),那么很容易找出答案。因此,没有数据,这里的任何人都只能猜测。
  • @JohnE 好点。首先我也是这么想的,那是 12 月 8 日,这可以解释额外的行。但我检查了与日期时间相关的值,并确认它是 8 月(12 日)。日期时间的index.dtypedatetime64[ns],格式为%Y/%d/%m %H:%M:%S。我尝试您的建议来重现错误。

标签: python-3.x pandas csv datetime dataframe


【解决方案1】:

您想要重新索引您的数据,而不仅仅是重新采样。

import pandas as pd
df = df.set_index('Datetime').resample('15min').mean()
new_index = pd.date_range(start=df.index.min(), end=df.index.max(), freq="15min")
df = df.reindex(new_index, fill_value=0)

这将根据提供的 date_range 将新值添加到您的索引中。

【讨论】:

  • 您好,Gabriel A。问题仍然存在。日期时间间隔已正确填充,但现在值为NaN。仍然数据帧行以2017-12-08 23:45:00 结尾,并且行数过高[32544 rows x 1 columns]
  • 您可以用 0 填充 NA 值。我想我需要更详细地说明您希望数据的样子
  • 好吧,让我再解释一下。我有一个 csv 文件,其中包含 2 列 "Datetime" 和 "Value" 。行数为15541。日期时间从 2017-01-04 00:00:00 开始,到 2017-09-09 23:45:00 结束。在这个日期范围内,存在一些日期时间间隔 - 确切地说是 10。这意味着如果我用 resample() 填充间隔,我的数据框中的总行数应该是15551 在我的新数据框中提到的日期范围内。实际上,使用我的代码或您发布的解决方案,日期范围在2017-08-12' 23:45:00 的早期结束,行数为32544。这种不一致就是问题所在。
猜你喜欢
  • 2020-10-29
  • 2017-08-09
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多