python-3.x - 使用 ISO 8601 时间戳和自定义刻度解析多个 *.csv

标签 python-3.x pandas csv numpy matplotlib

我正在对输出数据 *.csv 文件进行后处理,并且喜欢使用 Python3.7/Numpy/Matplotlib。

数据是分钟日志旋转文件名:

POWER_2018-08-19T00:56.csv 
POWER_2018-08-19T00:57.csv
POWER_2018-08-19T00:58.csv
TEMP_2018-08-19T00:56.csv
TEMP_2018-08-19T00:57.csv
TEMP_2018-08-19T00:58.csv

具有以下结构(无标题,示例来自“POWER_*.csv”内容):

2018-08-19T00:57:23.166;11.991;0.298;27.991;0.691; 2018-08-19T00:57:26.170;11.991;0.298;27.991;0.691; 2018-08-19T00:57:29.175;11.991;0.299;27.991;0.691; 2018-08-19T00:57:32.177;11.992;0.300;27.991;0.691; 2018-08-19T00:57:35.181;11.991;0.298;27.990;0.691; 2018-08-19T00:57:38.185;11.991;0.300;27.991;0.691; 2018-08-19T00:57:41.189;11.991;0.299;27.991;0.691; 2018-08-19T00:57:44.193;11.991;0.299;27.991;0.691; 2018-08-19T00:57:47.197;11.991;0.301;27.991;0.691; 2018-08-19T00:57:50.206;11.991;0.299;27.991;0.691; 2018-08-19T00:57:53.209;11.991;0.298;27.991;0.691; 2018-08-19T00:57:56.213;11.992;0.299;27.991;0.691; 2018-08-19T00:57:59.217;11.991;0.299;27.990;0.691; 2018-08-19T00:58:02.222;11.991;0.299;27.992;0.691; 2018-08-19T00:58:05.226;11.991;0.299;27.991;0.691; 2018-08-19T00:58:08.229;11.991;0.299;27.991;0.691; 2018-08-19T00:58:11.233;11.991;0.298;27.991;0.691; 2018-08-19T00:58:14.237;11.992;0.299;27.991;0.691;

因此,我使用以下 MCV 示例来解析这些内容:

import glob
import dateutil
import datetime
import numpy as np

filenames = sorted(glob.glob('/windows/data/2018-08-19T00:57/POWER*.csv'))

for f in filenames:
    print(f)
    df = np.genfromtxt(f, names=['Timestamp', 'Volt1', 'Curr1', 'Volt2', 'Curr2'], delimiter=';',converters={0:dateutil.parser.parse},dtype=[datetime.datetime, np.float, np.float, np.float, np.float])
    print(df)
    data = np.concatenate(df)

print(data)

这让我返回:

./parse_csv.py                                                             420ms  Thu 23 Aug 2018 06:06:00 PM CEST
/windows/data/2018-08-19T00:57/POWER_2018-08-19T00:57.csv
[(datetime.datetime(2018, 8, 19, 0, 57, 5, 132000), 11.991, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 8, 145000), 11.991, 0.3  , 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 11, 150000), 11.991, 0.3  , 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 14, 153000), 11.991, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 17, 157000), 11.992, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 20, 162000), 11.992, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 23, 166000), 11.991, 0.298, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 26, 170000), 11.991, 0.298, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 29, 175000), 11.991, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 32, 177000), 11.992, 0.3  , 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 35, 181000), 11.991, 0.298, 27.99 , 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 38, 185000), 11.991, 0.3  , 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 41, 189000), 11.991, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 44, 193000), 11.991, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 47, 197000), 11.991, 0.301, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 50, 206000), 11.991, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 53, 209000), 11.991, 0.298, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 56, 213000), 11.992, 0.299, 27.991, 0.691)
 (datetime.datetime(2018, 8, 19, 0, 57, 59, 217000), 11.991, 0.299, 27.99 , 0.691)]
Traceback (most recent call last):
  File "./parse_csv.py", line 27, in <module>
    data = np.concatenate(df)
ValueError: zero-dimensional arrays cannot be concatenated

以下原因/问题让我感到困惑:
a.)在我引入转换器以对抗日期时间格式转换回日期时间后,串联不再起作用。解析多个(相关且相似)cvs 文件的最佳方法是什么? Pandas 在这里有什么帮助吗?使用不同的 csv 输入真的很糟糕吗?
b.) 我想根据时间戳 (X) 在 Y 轴上绘制所有非时间戳值(此处为 4),但这些值不会定期采样:如何在真实时间线中拉伸(stretch)我的时间戳/值?使用填充来弥补缺失值?自定义勾选是答案吗?

感谢您的提示!

最佳答案

我建议使用pandas来处理时间序列。加载 csv 数据并连接文件几乎是一行代码(嗯,实际上是两行代码...):

import pandas as pd

data = pd.DataFrame()
for f in filenames:
    print(f)
    df = pd.read_csv(
        f, sep=';', index_col=0, header=None,
        parse_dates=True, infer_datetime_format=True)
    print(df)
    data = pd.concat((data, df), axis=0)

pandas 将数据内部存储为 np.ndarray。因此,如果您希望获得这种格式的数据,可以使用 data_as_ndarray = df.values 获取数据。

如果您有多个 csv 文件,列中包含不同的数据,例如一组文件中的功率和另一组文件中的温度,我建议将每组文件加载到单独的文件中,然后将生成的数据帧与以下内容连接起来:

df_total = pd.concat((df_total_power, df_total_temp), axis=1)

如果您的多个 csv 文件没有及时完全排序,您应该在连接后按索引对数据进行排序:

df.sort_index(inplace=True)

np.nan 连接两个具有不同时间戳的文件,然后可以填充:

df_total = df_total.interpolate()

使用 pandas,您还可以绘制不规则间隔的时间序列。只需调用 data.plot.line() 即可。但当然,您可以将数据重新采样为均匀间隔的数据,例如 10 毫秒

data = data.resample('10ms').mean().interpolate()

这将采用下采样的平均值(如果有)并插入 np.nan 进行上采样。

关于python-3.x - 使用 ISO 8601 时间戳和自定义刻度解析多个 *.csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51990150/

相关文章:

python - 由于数据长度不等,将嵌套 JSON 列表展平为 Pandas DataFrame 时出现问题

python - 从csv文件Python计算一行值的总和

python-3.x - 如何单击 "Next"按钮直到它不再存在 - Python、Selenium、Requests

python - 如何在迭代时使用 .delete() 删除 numpy 中的特定数组?

python - Pandas 在 Python 的应用函数中按列名获取行值?

python - 与 Pandas 总结几个月

csv - 将结构写入 csv 文件

python - 文件 python 的压缩列表

python - 如何从经/纬度坐标计算形状并用绘图绘制它

python - 从 X-Y 元组列表的字典中获取最大 X 和 Y 的最有效方法