【问题标题】:Time Series Data: Fill gaps in timeseries data and aggregate values时间序列数据:填补时间序列数据和汇总值的空白
【发布时间】:2020-05-31 05:51:50
【问题描述】:

我是使用 VBA 在 Excel 工作表中组织一些数据的新手。如果这更容易的话,我也有一些 Python 经验。

我有一个来自模型的 .csv 文件,该文件输出不连续的时间序列(只要有流入,但不是每 1 分钟时间步长):

日期/时间排水 cm/BRA
5/10/14 11:00 0
5/10/14 11:01 1
5/10/14 11:02 2
5/10/14 11:03 2
5/10/14 11:04 1
5/11/14 7:00 1
5/11/14 7: 01 0
5/11/14 7:02 1
5/11/14 7:03 1
5/11/14 7:04 0
5/11/14 7:05 0

我想要的是能够将数据聚合到 2 分钟的时间步长。所以我得到了这个:

日期/时间排水厘米/胸罩
2014 年 5 月 10 日 11:00 1
14 年 5 月 10 日 11:02 4
14 年 5 月 10 日 11:04 1
5/10/14 11:06 0
5/10/14 11:08 0
...

...
5/11/14 6:58 0
5/11/14 7:00 1
5/11/14 7:02 2
5/ 11/14 7:04 0

只要我有一个连续的数据文件,我已经有一个代码可以为我汇总数据(在这个例子中,填补了 14 年 5 月 10 日 11:04 到 14 年 5 月 11 日 7:00 之间的空白)。正如您可以想象的那样,对于微小的数据,手动填充的空白太多了,更不用说我必须为超过 70 个输出文件重现这个。

关于创建连续时间序列或聚合到 2 分钟的任何建议,尽管时间序列中的间隙不均匀??

【问题讨论】:

  • 到目前为止您尝试了哪些方法,遇到了哪些问题?
  • 你可以试试曲线拟合算法。
  • 使用 Pandas 似乎是合乎逻辑的(最简单的路线)。查看this question;可能会让你朝着正确的方向开始。首先,使用pandas.DataFrame.read_excel() 函数将您的数据读入pandas.DataFrame
  • @braX 我尝试对每两列求和以进行聚合,但是在跳过步骤时这不起作用(例如 5/10/14 11:00 值和 5/11/14 7:00 值会添加为 2 分钟时间步 11:00-11:02) 的总数。接下来,我尝试使用 if 语句来验证前一个单元格实际上只有 2 分钟的差异,但是当我这样做时,它在 11:02 正确输出但跳过了 11:04(因为下一个单元格 7:00 是不是 2 分钟的步骤),然后从 7:01 开始,因为那是 11:04 以下的 2 个单元格。这行不通,因为现在所有时间步都以奇数而不是偶数结尾。
  • 感谢@S3DEV。我会调查的。

标签: python python-3.x vba time-series aggregate


【解决方案1】:

试试这个解决方案。它采用pandas 和以下技术:

  • 将 CSV 文件读入 DataFrame
  • 合并列数据
  • 将日期/时间字符串转换为 datetime 数据类型
  • Resamplingdatetime 对象以 2 分钟为间隔

数据质量问题:

您的 CSV 中有几个数据质量问题:

  • 数据实际上不是逗号分隔的
  • 列名中有空格
  • 数据中有两列,但有三个空格(日期、时间、排水)

给出上述内容,有一段代码可以解决这些问题。

示例代码:

import pandas as pd

# Read Excel file into DataFrame.
df = pd.read_csv('./drainage.csv', sep=' ')

# Address data quality issues:
# Combine date and time columns.
df['Date/Time Drainage'] = df['Date/Time'] + ' ' + df['Drainage']
# Drop unneeded columns.
df.drop(['Date/Time', 'Drainage'], axis=1, inplace=True)
# Ensure Date/Time column is a datetime datatype.
df['Date/Time Drainage'] = pd.to_datetime(df['Date/Time Drainage'], format='%m/%d/%y %H:%M')

# Resample to 2 second intervals and sum results.
df = df.set_index('Date/Time Drainage').resample('2T').sum().reset_index()

# Show results.
print(df)

输出:

     Date/Time Drainage  cm/BRA
0   2014-05-10 11:00:00       1
1   2014-05-10 11:02:00       4
2   2014-05-10 11:04:00       1
3   2014-05-10 11:06:00       0
4   2014-05-10 11:08:00       0
5   2014-05-10 11:10:00       0
...
597 2014-05-11 06:54:00       0
598 2014-05-11 06:56:00       0
599 2014-05-11 06:58:00       0
600 2014-05-11 07:00:00       1
601 2014-05-11 07:02:00       2
602 2014-05-11 07:04:00       0

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2018-04-15
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多