将Pandas DatetimeIndex转换为一年中的小数日

时间:2014-12-16 10:26:26

标签: python datetime pandas

是否有一种简单的方法可以将DatetimeIndex转换为多年的数组,包括小时,分钟等组件?

例如,转换pd.date_range("2014-01-01 00:00", periods=4, freq="12H")应该会给我[1.0, 1.5, 2.0, 2.5]

2 个答案:

答案 0 :(得分:3)

Timedelta功能需要0.15.0。这将具有您日期的完全精确度。

In [19]: s
Out[19]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-01-01 00:00:00, ..., 2014-01-02 12:00:00]
Length: 4, Freq: 12H, Timezone: None

In [21]: s-s[0]
Out[21]: 
<class 'pandas.tseries.tdi.TimedeltaIndex'>
['0 days 00:00:00', ..., '1 days 12:00:00']
Length: 4, Freq: None

In [22]: ((s-s[0]) / pd.Timedelta(1.0,unit='D')) + 1
Out[22]: Float64Index([1.0, 1.5, 2.0, 2.5], dtype='float64')

TimedeltaIndex除以Timedelta会得到一个(浮点)分数。日期为0,所以我们加回1。

以上“假设”所有日期都在同一年。这是一种更健壮的方法(目前不支持datetimeindex减法)

In [53]: pd.TimedeltaIndex(s.asi8-s.to_period('A').to_timestamp().asi8)
Out[53]: 
<class 'pandas.tseries.tdi.TimedeltaIndex'>
['0 days 00:00:00', ..., '1 days 12:00:00']
Length: 4, Freq: None

答案 1 :(得分:1)

我不确定是否有内置方法可以更整齐地实现这一点,但您可以这样做:

dr = pd.date_range("2014-01-01 00:00", periods=4, freq="12H")
dr.dayofyear + dr.hour / 24.0
Out[8]: array([ 1. ,  1.5,  2. ,  2.5])

不幸的是,通过这种方法,我认为你必须创建足够的术语来达到你想要的精度,例如:包括会议纪要:

dr.dayofyear + dr.hour / 24.0 + dr.minute / (24.0 * 60)