与pandas对时数据帧

2024-06-25 23:40:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图使用pandas数据帧分析几个星期内测量“X”的平均每日波动,但是时间戳/日期时间等被证明是特别可怕的。花了好几个小时试图解决这个问题,我的代码变得越来越混乱,我不认为我已经接近一个解决方案,希望这里有人能引导我朝着正确的方向。

我在不同的时间和不同的日期测量了X,将每日结果保存到一个数据框中,该数据框的格式为:

    Timestamp(datetime64)         X 

0    2015-10-05 00:01:38          1
1    2015-10-05 06:03:39          4 
2    2015-10-05 13:42:39          3
3    2015-10-05 22:15:39          2

随着测量时间的日复一日的变化,我决定使用binning来组织数据,然后计算出每个bin的平均值和STD,然后我可以绘制出来。我的想法是创建一个最终的数据框架,其中包含容器和测量值X的平均值,“观察”列只是为了帮助理解:

        Time Bin       Observations     <X>  

0     00:00-05:59      [ 1 , ...]       2.3
1     06:00-11:59      [ 4 , ...]       4.6
2     12:00-17:59      [ 3 , ...]       8.5
3     18:00-23:59      [ 2 , ...]       3.1

然而,我遇到了时间、日期时间、日期时间64、时间增量和使用pd.cut和pd.groupby的binning之间不兼容的困难,基本上我觉得我是在暗中捅刀子,不知道如何“正确”地解决这个问题。我能想到的唯一解决方案是通过数据帧逐行迭代,但我真的希望避免这样做。


Tags: 数据代码证明pandas格式时间解决方案方向
3条回答

我不确定我是否有最好的答案,但我认为它仍然有效。
首先,我将使用以下示例将datetime64转换为datetimeConverting between datetime, Timestamp and datetime64

然后,如果我们假设您的第一列有datetime,并被称为TimeStamp,我将执行如下操作:

def bin_f(x):
    if x.time() < datetime.time(6):
        return "00:00-05:59"
    elif x.time() < datetime.time(12):
        return "06:00-11:59"
    elif x.time() < datetime.time(18):
        return "12:00-17:59"
    else:
        return "18:00-23:59"

df["Bin"] = df["TimeStamp"].apply(bin_f)
grouped = df.groupby("Bin")
grouped['X'].agg(np.std)

X作为列的名称。

我发现Mathiou的回答对我的目的很有帮助,但修改如下:

def bin_f(x):
    h = x.time()
    if h < 6:
        return "00:00-05:59"
    elif h < 12:
        return "06:00-11:59"
    elif h < 18:
        return "12:00-17:59"
    else:
        return "18:00-23:59"

每当我将时间序列数据按一个时间范围(这似乎是您在这里所做的)进行分类时,我只需创建一个“一天中的一小时”列并对其进行切片。另外,我通常将索引设置为datetime值……尽管这里不需要这样做。

# assuming your "timestamp" column is labeled ts: 
df['hod'] = [r.hour for r in df.ts]

# now you can calculate stats for each bin
ave = df[ (df.hod>=0) & (df.hod<6) ].mean()

我认为这里有一种使用df.resample的方法,但是对于时间序列中定义不明确的起点/终点,我认为这可能比上面的方法需要更多的关注。

这是你想要的吗?

相关问题 更多 >