GVKun编程网logo

使用Python / Pandas提取时间序列中的工作日(python pandas提取日期中的月份)

3

在本文中,我们将详细介绍使用Python/Pandas提取时间序列中的工作日的各个方面,并为您提供关于pythonpandas提取日期中的月份的相关解答,同时,我们也将为您带来关于Pandas-Pyt

在本文中,我们将详细介绍使用Python / Pandas提取时间序列中的工作日的各个方面,并为您提供关于python pandas提取日期中的月份的相关解答,同时,我们也将为您带来关于Pandas-Python 如何从列中提取数据、Pandas-如何从Python的datetime列中提取HH:MM?、pandas的时间序列:日期操作、时间序列平滑、pandas,python-如何选择时间序列中的特定时间的有用知识。

本文目录一览:

使用Python / Pandas提取时间序列中的工作日(python pandas提取日期中的月份)

使用Python / Pandas提取时间序列中的工作日(python pandas提取日期中的月份)

我正在处理“时间序列”中的高频数据, 我希望从我的数据中获取所有工作日
。我的数据观察结果以秒为单位,因此每天有86400秒,我的数据集分布在31天之内(因此有2678400个观察值!)。

这是我的数据的(一部分):

In[1]: tsOut[1]: 2013-01-01 00:00:00    0.4809282013-01-01 00:00:01    0.4809282013-01-01 00:00:02    0.4839772013-01-01 00:00:03    0.4867252013-01-01 00:00:04    0.486725...2013-01-31 23:59:56    0.4516302013-01-31 23:59:57    0.4516302013-01-31 23:59:58    0.4516302013-01-31 23:59:59    0.454683Freq: S, Length: 2678400

我想做的是创建一个新的时间序列,其中包含本月的工作日,但我希望它们具有相应的数据秒。
例如,如果2013年1月1日(星期三)至2013年1月4日(星期五)是一月第一周的第一工作日,则:

2013-01-02 00:00:00    0.5074772013-01-02 00:00:01    0.501373...2013-01-03 00:00:00    0.4897782013-01-03 00:00:01    0.489778...2013-01-04 23:59:58    0.5981152013-01-04 23:59:59    0.598115Freq: S, Length: 259200

因此,由于这些是周末,因此当然会排除2013年1月5日和2013年1月6日星期六的所有数据。等等…

我尝试使用一些内置的pandas命令,但是由于它们是按日汇总的,因此没有找到正确的命令,而没有考虑到每天其中都包含子列。也就是说,每一秒都有一个值,不应将它们取平均值,而应将其分组为一个新的序列。

例如我试过:

  1. ts.asfreq(BDay()) ->查找工作日,但每天平均
  2. ts.resample() ->您必须定义“方式”(平均值,最大值,最小值…)
  3. ts.groupby(lambda x : x.weekday) ->也不行!
  4. ts = pd.Series(df, index = pd.bdate_range(start = ''2013/01/01 00:00:00'', end = ''2013/01/31 23:59:59'' , freq = ''S'')) -> df,因为原始数据为DataFramem。使用pd.bdate_range并没有帮助,因为df和index必须在同一维上。

我在熊猫文档中搜索过,但用谷歌搜索,但是找不到线索…
有人有想法吗?

我将衷心感谢您的帮助!

谢谢!

ps:我宁愿不使用循环,因为我的数据集很大…(我还有其他几个月要分析)

答案1

小编典典

不幸的是,这有点慢,但是至少应该给出您想要的答案。

#create an index of just the date portion of your index (this is the slow step)ts_days = pd.to_datetime(ts.index.date)#create a range of business days over that periodbdays = pd.bdate_range(start=ts.index[0].date(), end=ts.index[-1].date())#Filter the series to just those days contained in the business day range.ts = ts[ts_days.isin(bdays)]

Pandas-Python 如何从列中提取数据

Pandas-Python 如何从列中提取数据

如何解决Pandas-Python 如何从列中提取数据?

Panda 从 url 接收数据并制作数据表,如何从该数据框中提取特定列到列表中。具体来说,这是我的代码,允许熊猫从 url 中检索信息

url="https://pkgstore.datahub.io/core/nasdaq-listings/nasdaq-listed_csv/data/7665719fb51081ba0bd834fde71ce822/nasdaq-listed_csv.csv"
req = requests.get(url).content
companies = pd.read_csv(io.StringIO(req.decode(''utf-8'')))

当我这样做时 print(companies) 我得到以下结果:

enter image description here

我希望的输出是能够将 Symbol 列中的数据提取到一个列表中,以便该列表将包含 [''Symbol'',''AAIT'',''AAL'',...''ZUMZ'']

解决方法

这应该适用于您的用例:

# You can create the Symbols list with this:
symbols_list = companies[''Symbol''].to_list()

# This is not really needed. But as you want to have "Symbol" word at the start,you can do the following
your_desired_list = [''Symbol'']
your_desired_list += symbols_list

Pandas-如何从Python的datetime列中提取HH:MM?

Pandas-如何从Python的datetime列中提取HH:MM?

我只想从我的dfHH:MM中提取。我该怎么做?

这是对中列的说明df

count                     810unique                    691top       2018-07-25 11:14:00freq                        5Name: datetime, dtype: object

字符串值包括完整的时间戳。目标是将每一行解析HH:MM为另一个df,然后循环返回并仅将其提取%Y-%m-%d到另一个df中。

答案1

小编典典

假设df看起来像

print(df)             date_col0 2018-07-25 11:14:001 2018-08-26 11:15:002 2018-07-29 11:17:00#convert from string to datetimedf[''date_col''] = pd.to_datetime(df[''date_col''])#to get date onlyprint(df[''date_col''].dt.date)0    2018-07-251    2018-08-262    2018-07-29#to get time:print(df[''date_col''].dt.time)0    11:14:001    11:15:002    11:17:00#to get hour and minuteprint(df[''date_col''].dt.strftime(''%H:%M''))0    11:141    11:152    11:17

pandas的时间序列:日期操作、时间序列平滑

pandas的时间序列:日期操作、时间序列平滑

 
基础操作

1)将“字符类型的日期列”转化成“时间索引(DatetimeIndex)”

 

u  首先,利用 pandas 的to_datetime 方法,把 "date" 列的字符类型数据解析成 datetime 对象。然后,把 "date" 列用作索引。

df[''date''] = pd.to_datetime(df[''date''])

df.set_index("date", inplace=True)

 

u  一步转化

df2.index = pd.DatetimeIndex(df.index)

 

 

temp = pd.DatetimeIndex(data[''datetime''])

 

#获取日期

data[''date''] = temp.date

#获取时间点

data[''time''] = temp.time

 

#将日期转化为一周中的星期几

pd.DatetimeIndex(data.date).dayofweek

 

# 对时间类特征处理,产出一个时间长度变量

data[''dateDays''] = (data.date - data.date[0]).astype(''timedelta64[D]'')

 

 

2)将日期列索引转化每月当中的第几天,或者转化为一周里面的星期几。

 

再次使用bikes数据集

bikes = pd.read_csv(''../data/bikes.csv'', sep='';'', encoding=''latin1'', parse_dates=[''Date''], dayfirst=True, index_col=''Date'')

 

berri_bikes.index.day

 

berri_bikes.index.weekday

 

3)不规整的日期字符串会自动转化为标准类型来进行索引

 

bikes[''1/10/2011'']

bikes[''20110110'']

 

4)根据日期索引获取数据

 

longer_ts = Series(np.random.randn(1000), index=pd.date_range(''1/1/2000'', periods=1000))

 

#获取2001年的所有行

longer_ts[''2001'']

 

#获取2001年5月的所有行

longer_ts[''2001-05'']  同longer_ts.ix[''5-2001'']

 

#获取2011.01.07后的所有数据

longer_ts [datetime(2011, 1, 7):]  切片操作

 

 

dates = pd.DatetimeIndex([''1/1/2000'', ''1/2/2000'', ''1/2/2000'', ''1/2/2000'', ''1/3/2000''])

dup_ts = Series(np.arange(5), index=dates)

 

#判断日期索引中每个日期是否是单一的

dup_ts.index.is_unique

 

#如果索引的日期是单一的,返回该行的索引值

dup_ts[''1/3/2000'']

 

#如果索引的日期不是单一的,返回所有相同索引的行

dup_ts[''1/2/2000'']

 

日期的范围、频率与移动

 

下表是时间频率单位:

 

 

 

 

 

 

#生成某个范围的日期序列

pd.date_range(''4/1/2012'', ''6/1/2012'')

pd.date_range(start=''4/1/2012'', periods=20)

pd.date_range(end=''6/1/2012'', periods=20)

pd.date_range(''5/2/2012 12:56:31'', periods=5)

pd.date_range(''5/2/2012 12:56:31'', periods=5, normalize=True)  #返回的日期格式5/2/2012

 

 

#以一定频率产生时间序列

pd.date_range(''1/1/2000'', ''12/1/2000'', freq=''BM'')  #返回给定日期范围内每个月的最后一个工作日

pd.date_range(''1/1/2000'', ''1/3/2000 23:59'', freq=''4h'')

pd.date_range(''1/1/2000'', periods=10, freq=''1h30min'')

pd.date_range(''1/1/2012'', ''9/1/2012'', freq=''WOM-3FRI'')

 

# shift()将时间序列整体向前或向后移动固定长度的时间

ts = Series(np.random.randn(4), index=pd.date_range(''1/1/2000'', periods=4, freq=''M''))

 

ts.shift(2)

>>> 

2000-01-31         NaN

2000-02-29         NaN

2000-03-31      1.529481

2000-04-30      0.267158

 

ts.shift(-2)  #向后移动

 

#假设数据是股票价格数据,shift()常用来计算股票收益率

ts / ts.shift(1) – 1 

 

#按照某一个频率移动

ts.shift(2, freq=''M'')

ts.shift(3, freq=''D'')

ts.shift(1, freq=''3D'')

ts.shift(1, freq=''90T'')

 

#时间序列滚动的第二种方式

from pandas.tseries.offsets import Day, MonthEnd

now = datetime(2011, 11, 17)

 

now + 3 * Day()  #滚动到3天后的日期

now + MonthEnd()  #滚动到当月末

now + MonthEnd(2)  #滚动到下个月末

 

#时间滚动的第三种方式

offset = MonthEnd()

offset.rollforward(now)  #从当前日期向前滚动到当月末

offset.rollback(now)   #从当前日期向后滚动到上月末

 

#计算平均值很重要的一种方式

from pandas.tseries.offsets import Day, MonthEnd

offset = MonthEnd()

 

ts = Series(np.random.randn(20), index=pd.date_range(''1/15/2000'', periods=20, freq=''4d''))

ts.groupby(offset.rollforward).mean()  #按月滚动,即计算每个月的平均值

 

时间序列的平滑化

 

 

 

 

#移动平均:每个时间点的值均由该时间点前窗口值大小的所有数的平均

pd.rolling_mean(close_px.AAPL, 250).plot()

 

pd.rolling_std(close_px.AAPL, 250, min_periods=10)

 

#指数加权移动平均

pd.ewma(aapl_px, span=60)

pandas,python-如何选择时间序列中的特定时间

pandas,python-如何选择时间序列中的特定时间

我现在使用python和pandas进行了一段时间的分析,以分析一组每小时的数据,并发现它非常不错(来自Matlab。)

现在我有点卡住了。我创建了DataFrame这样的:

SamplingRateMinutes=60index = DateRange(initialTime,finalTime, offset=datetools.Minute(SamplingRateMinutes))ts=DataFrame(data, index=index)

我现在想做的是选择10到13和20-23时的全天数据,以使用该数据进行进一步的计算。到目前为止,我使用

 selectedData=ts[begin:end]

而且我肯定会得到某种肮脏的循环来选择所需的数据。但是必须有一种更优雅的方法来索引我想要的内容。我确信这是一个常见问题,伪代码中的解决方案应如下所示:

myIndex=ts.index[10<=ts.index.hour<=13 or 20<=ts.index.hour<=23]selectedData=ts[myIndex]

值得一提的是,我是一名工程师,没有程序员:) …

答案1

小编典典

这是一个满足您需求的示例:

In [32]: from datetime import datetime as dtIn [33]: dr = p.DateRange(dt(2009,1,1),dt(2010,12,31), offset=p.datetools.Hour())In [34]: hr = dr.map(lambda x: x.hour)In [35]: dt = p.DataFrame(rand(len(dr),2), dr)In [36]: dtOut[36]: <class ''pandas.core.frame.DataFrame''>DateRange: 17497 entries, 2009-01-01 00:00:00 to 2010-12-31 00:00:00offset: <1 Hour>Data columns:0    17497  non-null values1    17497  non-null valuesdtypes: float64(2)In [37]: dt[(hr >= 10) & (hr <=16)]Out[37]: <class ''pandas.core.frame.DataFrame''>Index: 5103 entries, 2009-01-01 10:00:00 to 2010-12-30 16:00:00Data columns:0    5103  non-null values1    5103  non-null valuesdtypes: float64(2)

今天关于使用Python / Pandas提取时间序列中的工作日python pandas提取日期中的月份的介绍到此结束,谢谢您的阅读,有关Pandas-Python 如何从列中提取数据、Pandas-如何从Python的datetime列中提取HH:MM?、pandas的时间序列:日期操作、时间序列平滑、pandas,python-如何选择时间序列中的特定时间等更多相关知识的信息可以在本站进行查询。

本文标签: