【问题标题】:Extracting data values belonging to a day and compute average value to each day提取属于一天的数据值并计算每天的平均值
【发布时间】:2019-02-15 14:18:36
【问题描述】:

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

df_luminosidadDataFrame的维数为:

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: 列的值(没有重复的日期),并从 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() 函数创建一个数据帧,其值从df_luminosidad 前一个数据帧到指定频率,例如表示为@piRSquaredin this answer

从 1 月 12 日到 8 月 03 日有 203 天(28 周),那么我选择 204 就像period 属性,我使用的是freq 属性日历日频率D

df = pd.DataFrame(dict(
    Date=pd.date_range('2018-01-12', periods=204, freq='D'),
    Value=df_luminosidad['Luz (lux)'].mean()   
))

直到这里,该方法还不错,但我对如何计算使用pd.date_range 选择的每一天的Luz (lux) 值的平均值存在疑问,因为此时我只得到相同的平均值从2018-01-122018-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 | 

我已经通过每个 Fecha: 列值生成了一个数据框,我可以分别获得它们的平均值,但这迫使我阅读 每个文件日单独。

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

【问题讨论】:

  • 发布示例 df 和预期输出 df,而不是图像

标签: python pandas dataframe frequency series


【解决方案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()

【讨论】:

  • 很好,但是如果有一个或其他的选择,我会收到此错误消息TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'
  • @bgarcial -Waht 是print (df_luminosidad['Fecha:'].dtype) ?
  • 如果不是datetime,需要df_luminosidad['Fecha:'] = pd.to_datetime(df_luminosidad['Fecha:'])
【解决方案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. 

这可能是一种幼稚的方法,但现在我有这么多的建议给你。希望它有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多