提取属于一天的数据值并计算每天的平均值

时间:2018-09-11 06:20:50

标签: python pandas dataframe frequency series

我有一个日期范围为2018年1月12日至8月3日的数据集,其中包含一些值:

enter image description here

df_luminosidad DataFrame的维数为:

df_luminosidad.shape
(9752, 2)

每行数据的频率为半小时。第一行从2018-01-12

开始
df_luminosidad.iloc[0]

Fecha:       2018-01-12 00:17:28
Luz (lux)                      1
Name: 0, dtype: object

最后一行在2018-08-03

处结束
df_luminosidad.tail(1)

Fecha:  Luz (lux)
9751    2018-08-03 23:44:59 1

如上所述,有许多行对应于一天。

我想创建一个新的数据框,仅选择1天作为Fecha:列的值(没有重复的日期),然后从所有现有值中选择{{1}的所选日期的平均值}

这看起来像这样:

Luz(lux) column

我正在使用| Fecha: | Luz(lux) - Average each day values | | 2018-01-12 | 9183.479167 | | 2018-01-13 | 7431.8125 | | 2018-01-14 | 11073.1875 | | 2018-01-15 | 11456.25 | | . . | | . . | | . . | | 2018-08-03 | 11331.229167 | 函数创建一个数据帧,其值从pd.date_range()前一个数据帧到指定的频率,例如表示为@piRSquared in this answer

从1月12日到8月3日有203天(28周),然后我选择了204个df_luminosidad属性,而我使用的是period属性日历天频率freq < / p>

D

直到这里,这种方法都很好,但是我对如何计算df = pd.DataFrame(dict( Date=pd.date_range('2018-01-12', periods=204, freq='D'), Value=df_luminosidad['Luz (lux)'].mean() )) 所选择的每一天的Luz (lux)值的平均值存有疑问,因为在这一刻,我只得到一个从pd.date_range2018-01-12的所有天的平均相同值,例如:

2018-08-03

我已经按每个| Date | Value | | 2018-01-12 | 11228.888331 | | 2018-01-13 | 11228.888331 | | 2018-01-14 | 11228.888331 | | 2018-01-15 | 11228.888331 | | . . | | . . | | . . | | 2018-08-03 | 11331.229167 | 列值生成了一个数据框,并且可以分别获得它们的平均值,但这迫使我阅读 每个文件日。

如何生成一种循环方式,将一天中的所有值每天都分组为一个平均值,然后将它们放在一个数据框中?

2 个答案:

答案 0 :(得分:2)

对于时间序列分析,请尽可能先将日期列转换为索引,然后再方便地与日期配合使用。

df = pd.read_csv('file_name.csv', parse_dates =['Fecha'], index_col='Fecha')

然后,您可以将任何日期值提取到另一个临时数据框中。

dates = pd.date_range(start='2018-01-12 ', end='2018-08-03 ')

现在使用for循环,从“日期”列表中取消每个日期,然后将数据集的所需部分选择到另一个数据框中。

new_df = pd.DataFrame()   # Creating temporary data frame to store each day value
for temp_date in dates:
    required_date = str(temp_date)[:10]     # this is to fetch only date value from whole time stamp
    new_df = df1[required_date]  
# Now our requrired data is in new dataframe, and we can do all things to our new dataframe. 

这可能是一种幼稚的方法,但是现在我对您有很多建议。希望它能工作。

答案 1 :(得分:1)

我认为需要resamplemean或聚合meanGrouper

df_luminosidad['Fecha:'] = pd.to_datetime(df_luminosidad['Fecha:'])

df = df_luminosidad.resample('D', on='Fecha:')['Luz (lux)'].mean().reset_index()

或者:

df = (df_luminosidad.groupby(pd.Grouper(key='Fecha:', freq='D'))['Luz (lux)']
                    .mean()
                    .reset_index())

使用DatetimeIndex的另一种解决方案:

df_luminosidad['Fecha:'] = pd.to_datetime(df_luminosidad['Fecha:'])
df_luminosidad = df_luminosidad.set_index('Fecha:')


df = df_luminosidad.resample('D')['Luz (lux)'].mean().reset_index()
df = df_luminosidad.groupby(pd.Grouper(freq='D'))['Luz (lux)'].mean().reset_index()