问题:如何对datetime进行日期分离?例如,如果我希望知道星期几是否存在日历效应,那么该怎么做?(星期四最容易跌)
方式有很多种,我这里给出我觉得方便的两种:
我直接给出分离日期的部分代码:
这里面用到了一些lambda匿名函数,看起来比较装逼,但是实际上和另外一种方式是一样的(但是第二种方式无法提取星期几)
顺便提一嘴,对于pandas的dataframe来说,apply是比for循环要快的多的,而且看上去也简洁很多。
# 按照时间排序
df['trade_date'] = pd.to_datetime(df['trade_date']) # 对str进行类型转换
df = df.sort_values('trade_date')
# 分离日期
df['year'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%Y'))
df['month'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%m'))
df['week'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%W'))
df['weekday'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%w'))
df['monthday'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%d'))
# 重设索引
df.set_index('trade_date', drop=True, inplace=True)
第二种方式:
这种方式是从DatetimeIndex类型中直接提取的,简洁很多,但是也没有星期啥的的内容。
# 按照时间排序
df['trade_date'] = pd.to_datetime(df['trade_date'])
df = df.sort_values('trade_date')
# 重设索引
df.set_index('trade_date', drop=True, inplace=True)
# 分离日期
df['year'] = df.index.year
df['month'] = df.index.month
df['day'] = df.index.day
最后完整代码附上,有兴趣的朋友可以自己运行一下(记得替换自己的Tushare平台的token)
import pandas as pd
from datetime import datetime
import tushare as ts
def set_tushare(token):
ts.set_token(token)
pro_ = ts.pro_api()
return pro_
token = '你的Tushare代码'
pro_ = set_tushare(token)
df = pro_.index_daily(ts_code='000300.SH')
# 按照时间排序
df['trade_date'] = pd.to_datetime(df['trade_date'])
df = df.sort_values('trade_date')
# 分离日期
df['year'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%Y'))
df['month'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%m'))
df['week'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%W'))
df['weekday'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%w'))
df['monthday'] = df['trade_date'].apply(lambda x: datetime.strftime(x, '%d'))
# 重设索引
df.set_index('trade_date', drop=True, inplace=True)
# 查看涨跌情况在month的分布
df[['pct_chg', 'month']].groupby('month').mean().plot()
# 查看涨跌情况在weekday的分布
df[['pct_chg', 'weekday']].groupby('weekday').mean().plot()
# 查看涨跌情况在monthday的分布
df[['pct_chg', 'monthday']].groupby('monthday').mean().plot()
print(1)
“互联网精神”即:开放、平等、协作、快速、分享
对更多内容感兴趣欢迎关注我的个人公众号:梧承 Book House