繁体   English   中英

从大型时间序列数据帧生成每日定期间隔数据帧

[英]Generate daily periodic interval dataframes from a large time series dataframe

我有使用以下查询提取的 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 小时,每个数据帧分组为睡眠(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() 函数的信息,但我不确定在只有日期列的情况下如何最好地实现它。

我怎样才能最好地使用熊猫来实现这一点?

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

我不知道按天创建分隔数据帧的原因,但为什么不只使用一个带有变量的函数来返回输出,您可以使用用户输入的参数调用它,将其写回 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM