在this Q&A之后,我设法将多个CSV文件连接到一个时间序列数据帧中,并添加一列以添加每个记录来自的CSV文件的名称,例如:
import os
import glob
import pandas as pd
path = ''
all_files = glob.glob(os.path.join(path, "*.csv"))
names = [os.path.basename(x) for x in glob.glob(path+'\*.csv')]
df = pd.DataFrame()
for file_ in all_files:
file_df = pd.read_csv(file_, sep=',', parse_dates=["capture_datetime_utc"], index_col="capture_datetime_utc")
file_df['file_name'] = file_
df = df.append(file_df)
df.shape
这似乎很好用,并且-如您在this Jupyter Notebook中所见-i得到了一个形状为5列的数据框。
但是当我将该时间序列df从15分钟间隔下采样为每小时平均值时,就像这样:
df_h = df.resample('H').mean()
df_h.shape
我得到一个只有四列形状的数据框。
所以看来我执行的这个追加函数缺少持久性,我需要使其保持持久性。我尝试将“ inplace = True” arg插入附加函数本身(引发错误),并且在插入函数之后(没有区别)。
如果有人可以向我展示使该附加专栏永久化的方法,我将非常有义务!
答案 0 :(得分:0)
您的file_name
列已删除,因为它没有数字dtype
。更不用说,由于您正在通过mean()
有效地聚合数据帧,因此您对保留原始数据源的file_name不会有兴趣。在连接的数据框中取平均值之后,该信息将毫无意义。
我建议使用pd.concat()
代替df.append()
。给定两个示例csv文件:
sample1.csv
capture_datetime_utc,fertilizer_level,light,soil_moisture_present,air_temperature_celsius
2018-07-30 17:34:33,-1.0,1.28,12.13,26.42
2018-07-30 17:49:33,-1.0,1.26,11.87,26.51
2018-07-30 18:04:33,-1.0,1.26,11.47,26.37
2018-07-30 18:19:33,-1.0,1.17,12.00,26.28
2018-07-30 18:34:33,-1.0,0.94,11.47,25.34
sample2.csv
capture_datetime_utc,fertilizer_level,light,soil_moisture_present,air_temperature_celsius
2018-08-28 07:50:23,-1.0,40.73,6.53,31.82
2018-08-28 08:05:23,-1.0,47.13,6.65,33.65
2018-08-28 08:20:23,-1.0,51.94,6.65,35.00
2018-08-28 08:35:23,-1.0,57.46,6.65,36.55
2018-08-28 08:50:23,-1.0,14.17,6.77,32.98
您可以执行以下操作:
all_files = ['sample1.csv','sample2.csv']
df = pd.concat([pd.read_csv(file_, sep=',', parse_dates=["capture_datetime_utc"], index_col="capture_datetime_utc") for file_ in all_files], keys=all_files)
df = df.reset_index().set_index('capture_datetime_utc').groupby('level_0').resample('H').mean().dropna()
哪个给:
fertilizer_level light \
level_0 capture_datetime_utc
sample1.csv 2018-07-30 17:00:00 -1.0 1.270000
2018-07-30 18:00:00 -1.0 1.123333
sample2.csv 2018-08-28 07:00:00 -1.0 40.730000
2018-08-28 08:00:00 -1.0 42.675000
soil_moisture_present \
level_0 capture_datetime_utc
sample1.csv 2018-07-30 17:00:00 12.000000
2018-07-30 18:00:00 11.646667
sample2.csv 2018-08-28 07:00:00 6.530000
2018-08-28 08:00:00 6.680000
air_temperature_celsius
level_0 capture_datetime_utc
sample1.csv 2018-07-30 17:00:00 26.465000
2018-07-30 18:00:00 25.996667
sample2.csv 2018-08-28 07:00:00 31.820000
2018-08-28 08:00:00 34.545000