将部分datetimeindex换成1小时的熊猫

时间:2017-12-20 07:19:44

标签: python pandas datetime dataframe time-series

我在工作周期间有一个每小时值的数据框:

>>> vol_adjust.head()
Out[59]: 
2011-11-01 05:00:00+11:00   3237454603.000
2011-11-01 06:00:00+11:00   3292278695.000
2011-11-01 07:00:00+11:00   6037960826.000
2011-11-01 08:00:00+11:00   7127161746.000
2011-11-01 09:00:00+11:00   3382477744.000

>>> vol_adjust.shape
Out[60]: (29658, 1)

问题是一些价值落在星期六 - 通常只有1个值。我在整个数据框中有5个这样的日期:

>>> vol_adjust[vol_adjust.index.dayofweek == 5]
Out[63]: 
2012-03-03 00:00:00+11:00    794977434.400
2012-03-17 00:00:00+11:00    403171073.800
2013-03-16 00:00:00+11:00    808805223.800
2014-03-15 00:00:00+11:00   1622434962.000
2016-03-05 00:00:00+11:00    569319700.900
Name: vol, dtype: float64

经过检查,似乎在一周的某一天,数据会跳过00:00 AM(午夜),例如

>>> vol_adjust['2012-03-01'].tail()
Out[75]: 
2012-03-01 19:00:00+11:00    931207673.400
2012-03-01 20:00:00+11:00   2213366040.000
2012-03-01 21:00:00+11:00    994524108.700
2012-03-01 22:00:00+11:00    541624218.800
2012-03-01 23:00:00+11:00   2085975988.000
Name: vol, dtype: float64
>>> vol_adjust['2012-03-02'].head()
Out[70]: 
2012-03-02 01:00:00+11:00   1951010063.000
2012-03-02 02:00:00+11:00   1703256493.000
2012-03-02 03:00:00+11:00    947991961.000
2012-03-02 04:00:00+11:00   1210964133.000
2012-03-02 05:00:00+11:00    908680999.300
Name: vol, dtype: float64

我有办法识别这些日期,并希望从困难的一天开始到相应的星期六将时间提高1。有一个简单的方法吗?例如让我说我知道'2012-03-02'到'2012-03-03'是指数关闭1小时的时期,我怎样才能在那段时间内轻松将它上调1小时,同时保持其余不变?

1 个答案:

答案 0 :(得分:0)

您可以在索引上使用map并使用lambda功能。参见:

vol_adjust.index = vol_adjust.index.map(lambda x: x + pd.Timedelta(1, 'h') if str(x.date()) in trouble_days else x)

假设trouble_days采用字符串'2012-02-03'的形式,否则您无需进行str(x.date())转换。

请注意,这将在troubled_days中的所有小时数中移动1小时,这将在每天的每一天创建23个样本,在麻烦的一天之后创建25个样本,因为00:00将成为第二天01:00,索引条目将重复 - 我想你不希望这样。但是你可以在lambda函数中使用更复杂的逻辑对其进行排序。