[英]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.day
和dt.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.