Content
Single Index 的dataframe
对于Single Index 的dataframe :主要参照Indexing and Selecting Data 章节
basic indexing(1):loc iloc ix的column alignment机制对赋值的影响
主要参考 basic indexing
stackflow也有 回答
Warning pandas aligns all AXES when setting Series and DataFrame from .loc, and .iloc.
This will not modify df because the column alignment is before value assignment
使用loc进行slice后若要改变原Dataframe内部的值,需要注意直接赋值是没用的。因为loc iloc ix都会优先对齐column(column alignment),然后在赋值(value assignment),即会先把赋值表达式左右两边的column对齐(如此则失去了swap的意义),再赋值
正确做法应该是:使用raw values(这样就不会考虑到column的问题)
df.loc[:, ['B', 'A']] = df[['A', 'B']].values
slice object
所谓slice object,也即a:b形式的表达式。其中 .iloc接受a b分别为int类型的slice object, 如0:8, .loc接受a b分别为str类型的slice object,如 ‘2017-11-29 00:00:00’:‘2017-11-29 00:00:08’
而[]两种都接受。因此df[0:3] 与 df[‘a’:‘c’]是不一样的,前者是取0、1 、2三行(左开右闭),后者是取0 、1、 2、 3四行(左右都闭)。
并且若传入[ ]的是column names组成的slice object,则也是左右都闭的取法,只是此时是对列操作
[ ] 的理解
第一种用法:抽column/row
对于Series来说,得到的就只有对应的"Scalar Value ",因为label那一层消去了。
对于Dataframe来说,则是把对应行抽出来的Series(只选了一个column)/ Dataframe(选择了多个columns,其中这些column name必须组成一个list)
注意!!!
这里的参数必须得是column names,不能是序号 or index name(即类似loc的操作),因为形如[0:3]的操作是对row操作!!在这里0:3实际是一个slice object,int 型的slice object对于[]或者.iloc都是按row操作,都是.iloc是左右都闭,两种操作等价。同理对于loc,只是loc的slice object只接受对应Index的label,而不接受整数,并且统一是左右都闭合,此时[]也可以接受,作用等同于.loc
co2[['co2','pm10']] #取列
如下,是选择第0行至第3行的数据(左闭右开,因此还是取 0 1 2 三行)
co2[0:3] #取行
co2['2017-11-29 00:00:00':'2017-11-29 00:00:03'] #直接用index name取行也可,类似取columns的操作
同理使用iloc()
co2.iloc[0:3]
或者.loc()
co2.loc['2017-11-29 00:00:00':'2017-11-29 00:00:03'] #一样是取第 0 1 2 3行
可以看到
co2[0:3] 与 co2.iloc[0:3]
co2[‘2017-11-29 00:00:00’:‘2017-11-29 00:00:03’]与co2.loc[‘2017-11-29 00:00:00’:‘2017-11-29 00:00:03’]
分别是等价的。
NOTE:注意这里的使用slice object对row进行操作的时候,并不是直接去匹配index,即使index.to_list()后仍是由int组成的list
而是去匹配row number,具体可见下面的例子。
>>> t2.head(10)
day_id calling_nbr called_nbr ... raw_dur call_type calling_cell
41 20120201 365280 y21344771393 ... 35 2 341
50 20120201 389699 95812 ... 177 2 933
52 20120201 389699 95812 ... 859 2 933
56 20120201 389699 95812 ... 15 2 933
57 20120201 389699 95812 ... 972 2 933
179 20120201 790253 3067516 ... 100 2 432
188 20120201 1024869 y26611924753 ... 36 2 1000
292 20120201 477929 96103 ... 141 2 776
294 20120201 371621 y27036299949 ... 258 2 53831
298 20120201 394657 2909161 ... 171 2 537
[10 rows x 14 columns]
>>> t2.index.to_list()
[41, 50, 52, 56, 57, 179, 188, 292, 294, 298, 317, 318, 321, 329, 332, 377, 389, 442, 601, 602, 635, 640, 659, 731, 732, 826, 921, 926, 931, 936, 938, 1196, 1343, 1406, 1507, 1509, 1634, 1703, 1763, 1774, 1782, 1795, 1870, 1874, 1916, 1921, 2061, 2086, 2094, 2202, 2206, 2212, 2321, 2334, 2377, 2450, 2454, 2554, 2558, 2559, 2815, 2826, 2894, 2923, 2925, 2976, 2978, 3049, 3054, 3103, 3209, 3300, 3332, 3337, 3478, 3479, 3484, 3516, 3517, 3533, 3615, 3628, 3640, 3844, 3848, 3856, 3874, 3918, 3926, 3934, 3951, 3975, 4046, 4052, 4056, 4061, 4062, 4139, 4144, 4147, 4154, 4161, 4168, 4182, 4185, 4235, 4301, 4357, 4359, 4378, 4534, 4589, 4614, 4615, 4695, 4727, 4737, 4749, 4884, 4890, 4901, 4920, 4945, 4951, 4960, 4963, 5088, 5097, 5182, 5292, 5445, 5454, 5462, 5544, 5579, 5583, 5602, 5622, 5637, 5638, 5642, 5643, 5661, 5666, 5680, 5745, 5750, 5829, 6094, 6148, 6155, 6253, 6277, 6320, 6331, 6333, 6354, 6355, 6360, 6364, 6461, 6494, 6498, 6576, 6596, 6612, 6622, 6623, 6629, 6635, 6645, 6648, 6667, 6762, 6781, 6785, 6833, 6841, 6843, 6844, 6845, 6972, 7039, 7082, 7092, 7099, 7103, 7124, 7247, 7276, 7278, 7322, 7343, 7344, 7361, 7365, 7462, 7492, 7514, 7536, 7540, 7574, 7586, 7589, 7611, 7692, 7696, 7761, 7768, 7797, 7999, 8010, 8065, 8074, 8117, 8159, 8164, 8267, 8274, 8327, 8329, 8366, 8416, 8427, 8489, 8567, 8568, 8775, 8784, 8939, 9047, 9136, 9202, 9205, 9244, 9373, 9374, 9390, 9459, 9591, 9599, 9653, 9656, 9822, 9878, 9882, 9887, 9948, 9949, 9950, 9951, 10036, 10037, 10054, 10081, 10084, 10135, 10178, 10221, 10272, 10299, 10303, 10304, 10313, 10337, 10500, 10528, 10596, 10615, 10619, 10622, 10676, 10680, 10682, 10683, 10733, 10768, 10797, 10806, 10810, 10823, 10837, 10840, 10879, 10899, 10930, 10936, 11040, 11081, 11084, 11114, 11119, 11143, 11154, 11244, 11340, 11381, 11404, 11411, 11416, 11519, 11600, 11609, 11610, 11648, 11702, 11735, 11743, 11762, 11866, 11869, 11891, 11892, 11893, 11952, 11954, 11963, 11998, 12053, 12059, 12065, 12068, 12148, 12201, 12256, 12259, 12349, 12377, 12381, 12384, 12387, 12403, 12411, 12445, 12468, 12478, 12555, 12571, 12608, 12733, 12741, 12773, 12823, 12831, 12850, 12876, 12889, 12891, 12893, 12953, 13009, 13095, 13105, 13137, 13148, 13184, 13203, 13289, 13302, 13303, 13304, 13305, 13306, 13307, 13308, 13317, 13325, 13432, 13491, 13498, 13563, 13572, 13682, 13685, 13692, 13698, 13705, 13706, 13707, 13708, 13828, 13831, 13882, 13953, 13954, 13955, 13956, 13967, 13969, 14006, 14025, 14085, 14106, 14171, 14234, 14237, 14255, 14387, 14388, 14399, 14615, 14625, 14650, 14680, 14742, 14744, 14751, 14752, 14753, 14777, 14915, 14917, 14933, 14952, 14957, 14989, 15001, 15029, 15035, 15036, 15040, 15121, 15185, 15192, 15206, 15215, 15337, 15338, 15339, 15340, 15341, 15342, 15380, 15440, 15444, 15460, 15499, 15593, 15603, 15604, 15915, 15932, 15983, 15984, 16001, 16025, 16073, 16092, 16157, 16216, 16217, 16317, 16351, 16451, 16461, 16476, 16507, 16509, 16595, 16642, 16643, 16653, 16681, 16701, 16739, 16740, 16850, 16910, 17069, 17115, 17193, 17211, 17212, 17213, 17214, 17215, 17216, 17250, 17260, 17364, 17383, 17390, 17391, 17392, 17393, 17410, 17412, 17413, 17469, 17479, 17482, 17484, 17504, 17549, 17611, 17618, 17626, 17635, 17644, 17665, 17740, 17742, 17747, 17840, 17860, 17872, 17925, 17952, 17988, 17991, 18058, 18100, 18156, 18159, 18189, 18206, 18210, 18274, 18287, 18338, 18424, 18510, 18540, 18541, 18610, 18645, 18877, 18930, 19028, 19066, 19075, 19105, 19261, 19319, 19338, 19446, 19463, 19469, 19539, 19545, 19559, 19646, 19662, 19927]
>>> type(t2.index.to_list()[0])
<class 'int'>
可以看到下面[0:2](左闭右开),是取的前两行!!而不是index为0和1的那两行
>>> t2[0:2]
day_id calling_nbr called_nbr ... raw_dur call_type calling_cell
41 20120201 365280 y21344771393 ... 35 2 341
50 20120201 389699 95812 ... 177 2 933
[2 rows x 14 columns]
>>> t2.iloc[0:2]
day_id calling_nbr called_nbr ... raw_dur call_type calling_cell
41 20120201 365280 y21344771393 ... 35 2 341
50 20120201 389699 95812 ... 177 2 933
[2 rows x 14 columns]
第二种用法:Boolean array
第二种用法就是用一个和index相同长度的Boolean array来选择row,但是此时默认是把所有columns都加入到新的dataframe中(view)
co2[co2['Day']==0]
在这里选择了column 中 Day 对应为0的index,作为参数。得到Day 0 所对应的数据。
Boolean array
生成的Boolean array的方法有:
直接Series或DF中抽列(Series)进行逻辑判断
利用上面的,对Dataframe中取出的Series或者是直接是Series 进行逻辑判断,得到一个array
co2[co2['Day']==0]
对Dataframe中所有元素进行逻辑判断
或者如下面,直接对Dataframe中的所有元素进行逻辑判断,得到一个原Dataframe相同大小的 Boolean array
co2>20
利用isin(values)函数
不论是是df.isin() 还是 s.isin(),始终是会把values中的值去重,变成一个set,然后把原dataframe或者Series中的元素,一个一个判断是否在i.e. isin values的值组成的set 中,并返回一个与原Dataframe或者是Series同size,对应值位置True / False(即is in 或者 not in )的Boolean Dataframe/Series (Array)
对于Series/由Dataframe取列操作得到的Series,isin()要求传入的参数(values)必须是个set/list,返回一个原有Series中set/list元素对应位置的index,所组成的Series(array)
print('Slicing using [] into DataFrame result is a type {} \n'.format(type(co2['Day'])))
co2['Day'].isin([0])
而对于Dataframe, isin()函数,若传入的是一个Seires,则会将这个Series的index去匹配Dataframe的index(默认是single index,因此可以匹配),Series对应的值去匹配dataframe的各列**(而不管原来Series的name是否匹配上Dataframe的columns name)**,返回与原Dataframe相同大小,index与值都匹配成功的对应位置为True的Boolean Dataframe
(即本质还是把那个Series的values提出,组成一个set(即去了重),把Dataframe的每一列中的每个元素依次判断是否在那个set中)
在下面的例子可以看到,即使Series的name被设为‘co2’,isin()函数仍只匹配上了Day,而不会去匹配co2。因此传入的isin()的Series不一定要设定name。
index_series=pd.Series(co2.loc[co2['Day']==0,'Day'],name='co2')
co2.isin(index_series)
对于Dataframe,还可以传入dictionary,其中dictionary的key是对应列名即可,且不必包含原DataFrame中所有列(即其余列的位置都是False)。返回值仍然是一个和原Dataframe相同大小,但其中值为True/False 的Boolean Dataframe(array)
co2.isin({'Day':[0], 'pm10':[49, 52, 53, 54]})
若只是单纯对Dataframe.isin() 传入一个list,则用这个list其中的元素去匹配原Dataframe中值,而不管index或者columns,最后还是返回一个同大小的Boolean Dataframe(Array)。即Dataframe.values中的元素,有任何一个是在list中的,就把对应位置设为True,找不到则为False
co2.isin([49, 52, 53, 54])
where / mask 的用法
二者的可参入的参数都一样:
df.where(cond, other=Nan, axis=None, level=None)
df.mask(cond, other=Nan, axis=None, level=None)
其中other是用于替代原df对应位置的值,axis是用于alignment时指定沿着column align还是沿着row align,level主要是用于指定MultiIndex 时的align
二者区别在于,where是把满足cond的地方(True的地方)设为保留原来的值(即df对应位置的值),把False的位置设为other中对应的值(other默认为Nan,传入别的参数则为对应的参数,或者align后的参数)
而mash则是把不满足cond的地方(Fasle对应的地方)设为原来的值,True的地方用other 或者align 后的other进行替换
where() / mask() 主要用于Partial Selection,并对原Dataframe的局部进行赋值等操作
where()的具体用法可参考:https://www.cnblogs.com/waltertong/p/10316259.html
query的用法:本质都可以用pythonic 的风格代替
df[(df.a < df.b) & (df.b < df.c)] #选出a列值小于b列值且b列值小于c列值的行
df.query('(a < b) & (b < c)') #与上面代码相同效果
little trick:用query() 把index当做一列,与原有的列进行比较
df.query('a < b and b < c') # 将所谓“a”列,与b列,c列的值进行比较,找出index值小于b列值小于c列值的行
df.query('index < b < c') # 若未命名index,或者index name与column重合,则可以直接用index代替。(二者重合的情况下以column name优先)
df.query 也支持python的in / not in方法
df.query('a in b') # 判断a列中哪些元素是在b列组成的set中,并返回对应的一整行
df[df.a.isin(df.b)] # 利用isin() 的pythonic代码
df.query('a not in b') # 判断a中的哪些元素是在b列组成的set中,并返回对应的一整行
df[~df.a.isin(df.b)] #pythonic way
loc/iloc的用法
二者联系:
都是按照[row_indexer, column_indexer]来进行操作,
也可以按照[slice object]来操作,但此时就是只选择row
因为如下原因
Getting values from an object with multi-axes selection uses the following notation (using .loc as an example, but the following applies to .iloc as well). Any of the axes accessors may be the null slice :. Axes left out of the specification are assumed to be :, e.g. p.loc[‘a’] is equivalent to p.loc[‘a’, :, :].
因此只传入一个slice object,等价于只对第一个维度也就是row slice
都包含了Boolean array作为参数:具体方法详参本文的Boolean array章节
二者区别:
.loc() 主要是用于select by label(包含indexes name/ columns name)
loc() 主要用于select by position(即传入具体的某一row number / column number)
大概用法有
df.loc[df[c]\==0,'a'] #选择df 的第0行,第a列元素
df.iloc[df\==0,3] #选择df 的第0行,第3列元素
df.loc[df]
Set/ Reset index的用法
Set_index 主要是把原Dataframe中的某一(几)列抽出来(包含column names),插入到index中,并将对应index name设为column name。
Reset index 则是逆过程,把index(MultiIndex)中的某一个(几个)level的index抽出来,作为columns插入到原有的Dataframe中。
Selection 小结
只抽取row(s) / column(s) 即前者包括所有columns 后者包括所有row
[]:可接受 int 型slice object以及str 型的slice object,str可对应index names或者column names。
不接受两个以及以上的index(即只能对列或者行操作,而不能像iloc loc那样同时操作)
co2[0:3]
co2['2017-11-29 00:00:00':'2017-11-29 00:00:03']
#直接用index name取行也可,类似取columns的操作
.loc() 只接受str 型的slice object,单一slice object是对row操作
co2.loc['2017-11-29 00:00:00':'2017-11-29 00:00:03']
#直接用index name取行也可,类似取columns的操作。取0 1 2 3 rows
co2.loc[:,'Day':'time']
#取所有rows,对columns操作
.iloc() 只接受接受 int 型slice object
co2.iloc[0:3] #取 0 1 2 rows
co2.iloc[:,0:3] #左开右闭,取第0 1 2列
多个条件叠加(即对row 和 column 同时有限定)
中心思想就是:先用条件语句或者binary operation的组合得到对于row的Boolean array(Series),然后再对想要的column进行操作
其中对于row的Boolean array
- 可以通过直接逻辑判断(>/</==),及其组合(& | ~)如df[‘a’]<0 & df[‘b’]>2 共同筛选
- 也可以通过isin()函数,来更加具体的对row进行筛选
得到row 的Boolean array之后,再用loc iloc进行选择,注意最好避免chained indexing,因为不知道到底最后到底拿到是view 还是 copy
Example:
值得注意的是,第一个例子中是直接用index的isin()函数进行操作
#首先得到名为interested_period的对于row的Boolean Sereis,然后在对column限制。以下例子同理
co2.loc[co2.index.isin(interested_period),'co2':'pm10']
第二个例子中,利用到了逻辑判断语句的组合,但是要**注意加()标明语句间的顺序**,否则会报错
# 筛选出第0天中co2指数大于500的天
co2[(co2['Day']==0)&(co2['co2']>500)]
MultiIndex的Dataframe
参考:Using Slicers
推荐:利用slicers 。而且注意用.loc时,要把column indexer写全
法一:直接用Slicers组成的tuple
In[109]: single_grouper.corr()
Out[109]:
co2 ... pm2d5
Location datetime ...
C215011 2017-09-06 02:00:00 co2 1.000000 ... 0.598060
pm10 0.308473 ... 0.644924
pm1d0 0.657444 ... 0.784459
pm2d5 0.598060 ... 1.000000
2017-09-06 03:00:00 co2 1.000000 ... 0.357272
pm10 0.323055 ... 0.819824
pm1d0 0.282845 ... 0.826196
pm2d5 0.357272 ... 1.000000
2017-09-06 04:00:00 co2 1.000000 ... -0.142768
pm10 -0.189648 ... 0.698958
pm1d0 -0.114981 ... 0.748531
pm2d5 -0.142768 ... 1.000000
2017-09-06 05:00:00 co2 1.000000 ... -0.248906
pm10 -0.222500 ... 0.780316
pm1d0 -0.318003 ... 0.745051
pm2d5 -0.248906 ... 1.000000
2017-09-06 06:00:00 co2 1.000000 ... 0.093987
pm10 0.100579 ... 0.705466
pm1d0 0.161602 ... 0.661447
pm2d5 0.093987 ... 1.000000
2017-09-06 07:00:00 co2 1.000000 ... 0.233881
pm10 0.160716 ... 0.720342
pm1d0 0.165083 ... 0.749352
pm2d5 0.233881 ... 1.000000
2017-09-06 08:00:00 co2 1.000000 ... 0.569747
pm10 0.458880 ... 0.814600
pm1d0 0.591406 ... 0.843094
pm2d5 0.569747 ... 1.000000
2017-09-06 09:00:00 co2 1.000000 ... -0.074258
pm10 0.003474 ... 0.690436
... ... ...
C215020 2018-04-14 18:00:00 pm1d0 0.472544 ... 0.869046
pm2d5 0.383395 ... 1.000000
2018-04-14 19:00:00 co2 1.000000 ... 0.763890
pm10 0.740061 ... 0.933293
pm1d0 0.754770 ... 0.864587
pm2d5 0.763890 ... 1.000000
2018-04-14 20:00:00 co2 1.000000 ... 0.196739
pm10 0.247260 ... 0.645505
pm1d0 0.210897 ... 0.568587
pm2d5 0.196739 ... 1.000000
2018-04-14 21:00:00 co2 1.000000 ... 0.389391
pm10 0.293694 ... 0.913022
pm1d0 0.193768 ... 0.769192
pm2d5 0.389391 ... 1.000000
2018-04-14 22:00:00 co2 1.000000 ... -0.194604
pm10 -0.229500 ... 0.910552
pm1d0 -0.134890 ... 0.731365
pm2d5 -0.194604 ... 1.000000
2018-04-14 23:00:00 co2 1.000000 ... -0.356215
pm10 -0.272154 ... 0.940299
pm1d0 -0.388168 ... 0.851133
pm2d5 -0.356215 ... 1.000000
2018-04-15 00:00:00 co2 1.000000 ... -0.777221
pm10 -0.696396 ... 0.939822
pm1d0 -0.809884 ... 0.883817
pm2d5 -0.777221 ... 1.000000
2018-04-15 01:00:00 co2 1.000000 ... -0.403618
pm10 -0.328394 ... 0.841657
pm1d0 -0.336217 ... 0.684951
pm2d5 -0.403618 ... 1.000000
[101220 rows x 4 columns]
法二:用pd.IndexSlice
同样是要注意loc要指定好row index和column index
In[112]: idx=pd.IndexSlice
In[113]: single_grouper.corr().loc[idx[:, :, 'co2'], :]
Out[113]:
co2 pm10 pm1d0 pm2d5
Location datetime
C215011 2017-09-06 02:00:00 co2 1.0 0.308473 0.657444 0.598060
2017-09-06 03:00:00 co2 1.0 0.323055 0.282845 0.357272
2017-09-06 04:00:00 co2 1.0 -0.189648 -0.114981 -0.142768
2017-09-06 05:00:00 co2 1.0 -0.222500 -0.318003 -0.248906
2017-09-06 06:00:00 co2 1.0 0.100579 0.161602 0.093987
2017-09-06 07:00:00 co2 1.0 0.160716 0.165083 0.233881
2017-09-06 08:00:00 co2 1.0 0.458880 0.591406 0.569747
2017-09-06 09:00:00 co2 1.0 0.003474 -0.101632 -0.074258
2017-09-06 10:00:00 co2 1.0 0.672076 0.752501 0.742146
2017-09-06 11:00:00 co2 1.0 0.681013 0.787290 0.813576
2017-09-06 12:00:00 co2 1.0 0.190242 0.297774 0.234162
2017-09-06 13:00:00 co2 1.0 0.561493 0.608962 0.624777
2017-09-06 14:00:00 co2 1.0 0.452426 0.589878 0.585418
2017-09-06 15:00:00 co2 1.0 0.434273 0.493025 0.513818
2017-09-06 16:00:00 co2 1.0 0.272358 0.210343 0.261101
2017-09-06 17:00:00 co2 1.0 0.170626 0.277740 0.236819
2017-09-06 18:00:00 co2 1.0 0.271029 0.295988 0.349979
2017-09-06 19:00:00 co2 1.0 0.239557 0.203991 0.246133
2017-09-06 20:00:00 co2 1.0 0.163458 0.217716 0.179887
2017-09-06 21:00:00 co2 1.0 -0.003819 -0.061599 0.020957
2017-09-06 22:00:00 co2 1.0 -0.065252 0.014226 -0.069327
2017-09-06 23:00:00 co2 1.0 -0.153153 -0.070683 -0.146687
2017-09-07 00:00:00 co2 1.0 0.865989 0.875561 0.885547
2017-09-07 01:00:00 co2 1.0 0.864904 0.932527 0.920687
2017-09-07 02:00:00 co2 1.0 0.405383 0.550483 0.476642
2017-09-07 03:00:00 co2 1.0 -0.301033 -0.414535 -0.478034
2017-09-07 04:00:00 co2 1.0 -0.305678 -0.396347 -0.366256
2017-09-07 05:00:00 co2 1.0 -0.007007 -0.003598 0.022409
2017-09-07 06:00:00 co2 1.0 0.680386 0.817571 0.802834
2017-09-07 07:00:00 co2 1.0 0.244700 0.316053 0.340574
... ... ... ...
C215020 2018-04-13 20:00:00 co2 1.0 -0.179131 -0.249228 -0.302983
2018-04-13 21:00:00 co2 1.0 0.204458 0.304093 0.204479
2018-04-13 22:00:00 co2 1.0 0.107506 0.024135 0.125214
2018-04-13 23:00:00 co2 1.0 -0.220059 -0.093451 -0.168481
2018-04-14 00:00:00 co2 1.0 -0.115291 -0.192982 -0.064253
2018-04-14 01:00:00 co2 1.0 0.467321 0.406377 0.562045
2018-04-14 02:00:00 co2 1.0 -0.183294 -0.303493 -0.145360
2018-04-14 03:00:00 co2 1.0 -0.196301 -0.284329 -0.142990
2018-04-14 04:00:00 co2 1.0 0.184860 0.157116 0.181162
2018-04-14 05:00:00 co2 1.0 0.094443 0.085902 -0.026815
2018-04-14 06:00:00 co2 1.0 -0.600708 -0.466155 -0.618530
2018-04-14 07:00:00 co2 1.0 -0.534604 -0.567308 -0.592667
2018-04-14 08:00:00 co2 1.0 0.090428 -0.182726 -0.113695
2018-04-14 09:00:00 co2 1.0 0.372609 0.028516 0.402602
2018-04-14 10:00:00 co2 1.0 -0.281948 0.058078 -0.225148
2018-04-14 11:00:00 co2 1.0 -0.345226 -0.529968 -0.342974
2018-04-14 12:00:00 co2 1.0 -0.107841 0.129580 -0.041739
2018-04-14 13:00:00 co2 1.0 -0.796716 -0.759900 -0.827842
2018-04-14 14:00:00 co2 1.0 0.345321 0.251140 0.317384
2018-04-14 15:00:00 co2 1.0 -0.227834 -0.233218 -0.171758
2018-04-14 16:00:00 co2 1.0 -0.488537 -0.449984 -0.392343
2018-04-14 17:00:00 co2 1.0 -0.681828 -0.615714 -0.719129
2018-04-14 18:00:00 co2 1.0 0.345293 0.472544 0.383395