我正在对输出数据 *.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/