Python Pandas 日均值

mer*_*nfo 4 python pandas

我在 Pandas 数据库中获取每日平均值时遇到问题。我在这里检查了使用熊猫计算不规则时间序列的每日平均值,但它没有帮助。.csv 文件如下所示:

Date/Time,Value
12/08/13 12:00:01,5.553
12/08/13 12:30:01,2.604
12/08/13 13:00:01,2.604
12/08/13 13:30:01,2.604
12/08/13 14:00:01,2.101
12/08/13 14:30:01,2.666
Run Code Online (Sandbox Code Playgroud)

等等。我的代码如下所示:

# Import iButton temperatures
flistloc = '../data/iButtons/Readings/edit'
flist = os.listdir(flistloc)
# Create empty dictionary to store db for each file
pdib = {}
for file in flist:
    file = os.path.join(flistloc,file)
    # Calls function to return only name
    fname,_,_,_= namer(file)
    # Read each file to db
    pdib[fname] = pd.read_csv(file, parse_dates=0, dayfirst=True, index_col=0)
pdibkeys = sorted(pdib.keys())
#
# Calculate daily average for each iButton
for name in pdibkeys:
    pdib[name]['daily'] = pdib[name].resample('D', how = 'mean')
Run Code Online (Sandbox Code Playgroud)

数据库似乎没问题,但求平均值不起作用。这是在 iPython 中的样子:

'2B5DE4': <class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1601 entries, 2013-08-12 12:00:01 to 2013-09-14 20:00:01
Data columns (total 2 columns):
Value    1601  non-null values
daily    0  non-null values
dtypes: float64(2)}
Run Code Online (Sandbox Code Playgroud)

有谁知道这是怎么回事?

小智 6

这个问题有点老了,但无论如何我都想做出贡献,因为我不得不一遍又一遍地处理这个问题(我认为这不是真正的 Pythonic ......)。

到目前为止,我提出的最佳解决方案是使用原始索引创建一个主要为 NA 的新数据框,并在最后填充它。

davg = df.resample('D', how='mean')
davg_NA = davg.loc[df.index]
davg_daily = davg_NA.fillna(method='ffill')
Run Code Online (Sandbox Code Playgroud)

人们甚至可以把它挤在一条线上

df.resample('D', how='mean').loc[df.index].fillna(method='ffill')
Run Code Online (Sandbox Code Playgroud)

  • FutureWarning:如何弃用 .resample() // 新语法是 .resample(...).mean() (2认同)

exp*_*rer 2

当您调用resample1 列数据框时,输出将是具有不同索引的 1 列数据框- 每个日期作为其自己的索引条目。因此,当您尝试将其分配给原始数据框中的列时,我不知道您期望发生什么。

三种可能的方法(df原始数据框在哪里):

  1. 您实际上需要原始数据框中的平均值吗?如果不:

    davg = df.resample('D', how='mean')

  2. 如果这样做,不同的解决方案是在确保两个数据帧都有包含日期​​的列(而不是索引)后,在日期上合并两个数据帧。

'

davg = df.resample('D', how='mean')
df['day'] = df.index.apply(lambda x: x.date()) 
davg.reset_index('Date/Time', inplace=True)
df = pandas.merge(df, davg, left_on='day',right_on='Date/Time')
Run Code Online (Sandbox Code Playgroud)
  1. 2 的替代方案(不知道它是否更快)是简单地使用groupby日期。

    def compute_avg_val(df):
        df['daily average'] = df['Value'].mean()
        return df
    df['day'] = df.index.apply(lambda x: x.date())
    grouped = df.groupby('day')
    df = grouped.apply(compute_avg_val)
    
    Run Code Online (Sandbox Code Playgroud)