熊猫 - 将datetime64转换为Period

时间:2014-05-24 07:30:58

标签: python pandas

我有一系列datetime64格式的日期。

我想将它们转换为每月频率的一系列期间。 (基本上,我希望将日期分为几个月以便进行分析)。

必须有办法做到这一点 - 我很快就找不到它。

注意:这些日期不是数据框的索引 - 它们只是数据框中的一列数据。

示例输入数据(作为系列)

data = pd.to_datetime(pd.Series(['2014-10-01', '2014-10-01', '2014-10-31', '2014-11-15', '2014-11-30', np.NaN, '2014-12-01']))
print (data)

我目前的kludge /解决方案看起来像

data = pd.to_datetime(pd.Series(['2014-10-01', '2014-10-01', '2014-10-31', '2014-11-15', '2014-11-30', np.NaN, '2014-01-01']))
data = pd.DatetimeIndex(data).to_period('M')
data = pd.Series(data.year).astype('str') + '-' +  pd.Series((data.month).astype('int')).map('{:0>2d}'.format)
data = data.where(data != '2262-04', other='No Date')
print (data)

2 个答案:

答案 0 :(得分:0)

   import pandas as pd
   import numpy as np
   datetime import datetime
   data = pd.to_datetime(
   pd.Series(['2014-10-01', '2014-10-01', '2014-10-31', '2014-11-15', '2014-11-30', np.NaN, '2014-01-01']))
   data=pd.Series(['{}-{:02d}'.format(x.year,x.month) if isinstance(x, datetime) else "Nat" for x in pd.DatetimeIndex(data).to_pydatetime()])


0    2014-10
1    2014-10
2    2014-10
3    2014-11
4    2014-11
5        Nat
6    2014-01
dtype: object

我能想到的最好,如果可能的唯一非日期时间对象是浮点数,则可以将if isinstance(x, datetime)更改为if not isinstance(x, float)

答案 1 :(得分:0)

他们目前处理NaTPeriodIndex的问题(即使是在掌握中),所以你的方法不会像那样工作。但似乎你只是想重新取样;这样做。如果需要,您当然可以为how指定一个函数。

In [57]: data
Out[57]: 
0   2014-10-01
1   2014-10-01
2   2014-10-31
3   2014-11-15
4   2014-11-30
5          NaT
6   2014-12-01
dtype: datetime64[ns]

In [58]: df = DataFrame(dict(A = data, B = np.arange(len(data))))

In [59]: df.dropna(how='any',subset=['A']).set_index('A').resample('M',how='count')
Out[59]: 
            B
A            
2014-10-31  3
2014-11-30  2
2014-12-31  1