【问题标题】:Generate daily periodic interval dataframes from a large time series dataframe从大型时间序列数据帧生成每日周期间隔数据帧
【发布时间】:2021-01-20 20:50:15
【问题描述】:

我有使用以下查询提取的 31 天时间序列数据集。

import pymysql
import pymysql.cursors
import pandas as pd
import sys
import csv

conn = pymysql.connect(host='',user='',password='',db='',port='',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)

dbquery = """SELECT * FROM 'table_name' where 'date' between ('2012-03-01 00:00:00') and ('2012-03-31 23:59:59') """

df = pd.read_sql_query(dbquery, conn)
df.to_csv('one_month_timeseries_data.csv', sep=',', encoding='utf-8')

提取的数据帧结构如下。

id date                  value
1  2012-01-01 00:00:00   33
5  2012-01-02 00:00:01   15
.
.
.
.
2  2012-01-30 23:59:58   10
5  2012-01-31 23:59:59   5

我想进一步循环遍历整个数据集的每一天(00:00:00 - 23:59:59),并将数据帧分成 3 个独立的数据帧,每个数据帧间隔 8 小时,每个数据帧分组为 sleep (00:00:00 - 07:59:59), 工作 (08:00:00 - 15:59:59), (16:00: 00 - 23:59:59)。

预期输出

例如,第 1 天:

day1_df_sleep:

id date                  value
1  2012-01-01 00:00:00   33
.
.
.
.
3  2012-01-01 07:59:59   10

day1_df_work:

id date                   value
1  2012-01-01 08:00:00    12
.
.
.
.
4  2012-01-01 15:59:59    50

day1_df_home:

id date                   value
1  2012-01-01 16:00:00    12
.
.
.
.
4  2012-01-01 23:59:59    50

等..直到第 31 天

我已经阅读了 pandas 的 date_range() 函数,但我不确定在只有日期列的情况下如何最好地实现它。

如何最好地使用 pandas 实现这一点?

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    使用dt.daydt.hour 并通过按一天中的不同日期和时间进行过滤来创建新的数据框。您不能使用between() 作为.lt.ge 的替代品,因为在您想要的输出中,下限是包含的,而上限是独占的。作为一个单独的问题,您可以循环遍历每一天,下面是您每天要做的事情,您可以在循环遍历时为一天设置一个变量。每天循环并为每一天创建数据帧显然会稍微复杂一些。

    我不知道按天创建分隔数据帧的原因,但为什么不只使用一个带有变量的函数来返回输出,您可以使用用户输入的参数调用该函数,将其写回 sql 或excel 等,而无需创建单独的数据框。

    df['date'] = pd.to_datetime(df['date'])
    day1_df_sleep = df[df['date'].dt.day == 1 & df['date'].dt.hour.ge(0) & df['date'].dt.hour.lt(8)]
    day1_df_work = df[df['date'].dt.day == 1 & df['date'].dt.hour.ge(8) & df['date'].dt.hour.lt(16)]
    day1_df_home = df[df['date'].dt.day == 1 & df['date'].dt.hour.ge(16) & df['date'].dt.hour.lt(24)]
    

    例如,您可以执行以下操作来循环:

    df = d.copy()
    df['date'] = pd.to_datetime(df['date'])
    for i in range(1,31):
        day1_df_sleep = df[df['date'].dt.day == i & df['date'].dt.hour.ge(0) & df['date'].dt.hour.lt(8)]
        day1_df_work = df[df['date'].dt.day == i & df['date'].dt.hour.ge(8) & df['date'].dt.hour.lt(16)]
        day1_df_home = df[df['date'].dt.day == i & df['date'].dt.hour.ge(16) & df['date'].dt.hour.lt(24)]
        print(day1_df_sleep, day1_df_work, day1_df_home)
    

    【讨论】:

    • 非常感谢大卫。它部分工作。问题是它只循环遍历第 1 天的记录,而不会继续处理剩下的 30 天。
    • 没问题@Gee 这是获取不同数据帧的更难的解决方案。我知道有许多不同数据帧的用例,但我会设想一个带有参数的函数,您可以在 for 循环中运行,而不是在所有数据帧中运行。请在此处查看获得更多投票的第二个答案以及最后一个答案:stackoverflow.com/questions/30635145/…
    • 谢谢,顺便说一下,创建单独数据帧的原因是计算一天中每个时间间隔的几个特征,即睡眠、工作和家庭。
    • 如果使用 groupby 函数,我将返回 31 天中每一天的分组数据帧; df_grouped = df.groupby([df['date'].dt.date]) for j, df_group in df_grouped: print (df_group) 但挑战仍然存在于如何将您建议的 for 循环应用于每个每日组 (df_group) 以提取每天的数据帧间隔:睡觉、工作和回家。
    猜你喜欢
    • 1970-01-01
    • 2014-07-17
    • 2012-12-04
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多