圆形熊猫日期时间索引?

Posted

技术标签:

【中文标题】圆形熊猫日期时间索引?【英文标题】:Round pandas datetime index? 【发布时间】:2013-07-20 19:25:19 【问题描述】:

我正在将多个时间序列电子表格读入 pandas 数据帧,并将它们与一个常见的 pandas 日期时间索引连接在一起。记录时间序列的数据记录器不是 100% 准确,这使得重新采样非常烦人,因为根据时间是略高于还是略低于采样间隔,它会创建 NaN 并开始使我的系列看起来像一条折线。这是我的代码

def loaddata(filepaths):
    t1 = time.clock()
    for i in range(len(filepaths)):
        xl = pd.ExcelFile(filepaths[i])
        df = xl.parse(xl.sheet_names[0], header=0, index_col=2, skiprows=[0,2,3,4], parse_dates=True)
        df = df.dropna(axis=1, how='all') 
        df = df.drop(['Decimal Year Day', 'Decimal Year Day.1', 'RECORD'], axis=1)

        if i == 0:
            dfs = df
        else:
            dfs = concat([dfs, df], axis=1)
    t2 = time.clock()
    print "Files loaded into dataframe in %s seconds" %(t2-t1)

files = ["London Lysimeters corrected 5min.xlsx", "London Water Balance 5min.xlsx"]
data = loaddata(files)

这是索引的一个想法:

数据索引

类'pandas.tseries.index.DatetimeIndex'> [2012-08-27 12:05:00.000002, ..., 2013-07-12 15:10:00.000004] 长度:91910,频率:无,时区:无

将索引四舍五入到最接近的分钟最快和最通用的方法是什么?

【问题讨论】:

【参考方案1】:

这里有一个小技巧。日期时间以纳秒为单位(当被视为np.int64 时)。 所以在纳秒内四舍五入到分钟。

In [75]: index = pd.DatetimeIndex([ Timestamp('20120827 12:05:00.002'), Timestamp('20130101 12:05:01'), Timestamp('20130712 15:10:00'), Timestamp('20130712 15:10:00.000004') ])

In [79]: index.values
Out[79]: 
array(['2012-08-27T08:05:00.002000000-0400',
       '2013-01-01T07:05:01.000000000-0500',
       '2013-07-12T11:10:00.000000000-0400',
       '2013-07-12T11:10:00.000004000-0400'], dtype='datetime64[ns]')

In [78]: pd.DatetimeIndex(((index.asi8/(1e9*60)).round()*1e9*60).astype(np.int64)).values
Out[78]: 
array(['2012-08-27T08:05:00.000000000-0400',
       '2013-01-01T07:05:00.000000000-0500',
       '2013-07-12T11:10:00.000000000-0400',
       '2013-07-12T11:10:00.000000000-0400'], dtype='datetime64[ns]')

【讨论】:

完美运行,速度非常快!我不知道你可以这样对待 datetimeindex 你实际上在后台处理它们(index 大部分隐藏) 这也可以作为索引代码的一个很好的补充,你可以关注这个问题:github.com/pydata/pandas/issues/4314【参考方案2】:

Jeff 提到的问题4314 现已关闭,并且在 pandas 0.18.0 中为 DatetimeIndex、Timestamp、TimedeltaIndex 和 Timedelta 添加了round() 方法。现在我们可以执行以下操作:

In[109]: index = pd.DatetimeIndex([pd.Timestamp('20120827 12:05:00.002'), pd.Timestamp('20130101 12:05:01'), pd.Timestamp('20130712 15:10:30'), pd.Timestamp('20130712 15:10:31')])

In[110]: index.values
Out[110]: 
array(['2012-08-27T12:05:00.002000000', '2013-01-01T12:05:01.000000000',
       '2013-07-12T15:10:30.000000000', '2013-07-12T15:10:31.000000000'], dtype='datetime64[ns]')

In[111]: index.round('min')
Out[111]: 
DatetimeIndex(['2012-08-27 12:05:00', '2013-01-01 12:05:00',
               '2013-07-12 15:10:00', '2013-07-12 15:11:00'],
              dtype='datetime64[ns]', freq=None)

round() 接受频率参数。它的字符串别名列在here。

【讨论】:

【参考方案3】:

对于数据列; 使用:round_hour(df.Start_time)

def round_hour(x,tt=''):
    if tt=='M':
        return pd.to_datetime(((x.astype('i8')/(1e9*60)).round()*1e9*60).astype(np.int64))
    elif tt=='H':
        return pd.to_datetime(((x.astype('i8')/(1e9*60*60)).round()*1e9*60*60).astype(np.int64))
    else:   
        return pd.to_datetime(((x.astype('i8')/(1e9)).round()*1e9).astype(np.int64))

【讨论】:

以上是关于圆形熊猫日期时间索引?的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫中将索引转换为日期时间

熊猫以时间为索引获取特定日期的行数

熊猫滚动窗口和日期时间索引:“偏移”是啥意思?

如何在熊猫中将索引转换为日期时间?

熊猫数据框每天重新采样,没有日期时间索引

熊猫数据框每天重新采样,没有日期时间索引