在Python / Pandas中如何将Century-months转换为DateTimeIndex?

时间:2014-07-15 15:04:36

标签: python pandas

我正在处理一个数据集,该数据集将日期编码为自1899年12月以来的整数月数,因此第1个月是1900年1月,第1165年是1997年1月。我想转换为pandas DateTimeIndex。到目前为止,我提出的最好的是:

month0 = np.datetime64('1899-12-15')
one_month = np.timedelta64(30, 'D') + np.timedelta64(10.5, 'h')
birthdates = pandas.DatetimeIndex(month0 + one_month * resp.cmbirth)

开始日期是该月的15日,timedelta是30天10.5小时,即日历月的平均长度。因此,月内的日期会漂移一两天。

所以这看起来有点hacky,我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:3)

您可以使用内置的pandas日期时间功能。

import pandas as pd
import numpy as np

indexed_months = np.random.random_integers(0, high=1165, size=100)
month0 = pd.to_datetime('1899-12-01')
date_list = [month0 + pd.DateOffset(months=mnt) for mnt in indexed_months]
birthdates = pd.DatetimeIndex(date_list) 

我假设您的resp.cmbirth对象看起来像0到1165之间的整数数组。

我不太清楚为什么你希望索引的bin边缘从月的开始或结束偏移。这可以做到:

shifted_birthdates = birthdates.shift(15, freq=pd.datetools.day)

并且如果你想要的话,几个小时。此SO question和相关pandas github issue的答案中也有有用的信息。