问题描述
我需要使用 pandasql 从 pandas 数据框的日期列中提取日期特征(日、周、月、年)。我似乎无法找到正在使用的 sql pandasql 的哪个版本,所以我不确定如何完成这项壮举。有没有其他人尝试过类似的东西?
这是我目前所拥有的:
#import the needed libraries
import numpy as np
import pandas as pd
import pandasql as psql
#establish dataset
doc = 'room_data.csv'
df = pd.read_csv(doc)
df.head()
df2 = psql.sqldf('''
SELECT
Timestamp,EXTRACT (DAY FROM "Timestamp") AS Day --DOES NOT WORK IN THIS VERSION OF sql,Temperature,Humidity
FROM df
''')
df2.head()
数据框示例:
解决方法
据我所知,SQLite 不支持 EXTRACT() 函数。
你可以试试strftime('%d',Timestamp)
psql.sqldf('''SELECT
Timestamp,strftime('%d',Timestamp) AS Day,Temperature,Humidity
FROM df
''')
考虑以下演示上述查询的示例:
示例数据框:
np.random.seed(123)
dates = pd.date_range('01-01-2020','01-05-2020',freq='H')
temp = np.random.randint(0,100,97)
humidity = np.random.randint(20,97)
df = pd.DataFrame({"Timestamp":dates,"Temperature":temp,"Humidity":humidity})
print(df.head())
Timestamp Temperature Humidity
0 2020-01-01 00:00:00 66 29
1 2020-01-01 01:00:00 92 43
2 2020-01-01 02:00:00 98 34
3 2020-01-01 03:00:00 17 58
4 2020-01-01 04:00:00 83 39
工作查询:
import pandasql as ps
query = '''SELECT
Timestamp,Humidity
FROM df'''
print(ps.sqldf(query).head())
Timestamp Day Temperature Humidity
0 2020-01-01 00:00:00.000000 01 66 29
1 2020-01-01 01:00:00.000000 01 92 43
2 2020-01-01 02:00:00.000000 01 98 34
3 2020-01-01 03:00:00.000000 01 17 58
4 2020-01-01 04:00:00.000000 01 83 39
可以获取更多详情here获取更多日期提取功能,常见的如下所示:
import pandasql as ps
query = '''SELECT
Timestamp,strftime('%m',Timestamp) AS Month,strftime('%Y',Timestamp) AS Year,strftime('%H',Timestamp) AS Hour,Humidity
FROM df'''
print(ps.sqldf(query).head())
Timestamp Day Month Year Hour Temperature Humidity
0 2020-01-01 00:00:00.000000 01 01 2020 00 66 29
1 2020-01-01 01:00:00.000000 01 01 2020 01 92 34
2 2020-01-01 02:00:00.000000 01 01 2020 02 98 90
3 2020-01-01 03:00:00.000000 01 01 2020 03 17 32
4 2020-01-01 04:00:00.000000 01 01 2020 04 83 74
,
给你:
df['year'] = pd.DatetimeIndex(df['date']).year
df['month'] = pd.DatetimeIndex(df['date']).month
df['day'] = pd.DatetimeIndex(df['date']).day