Pandas - 将datetime64转换为Period
我有一系列的日期,格式是datetime64。
我想把这些日期转换成按月分组的时间段(也就是说,我想把日期归类到每个月,以便进行分析)。
应该有办法做到这一点,只是我找不到合适的方法。
注意:这些日期并不是数据框的索引,它们只是数据框中的一列数据。
下面是一个示例输入数据(作为一个Series)
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)
我现在的临时解决方案是
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)
3 个回答
0
你可以使用 data.dt.to_period('M')
这个方法。
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)
。
0
现在在处理PeriodIndex
中的NaT
时,有一些问题(即使是在主分支上),所以你的方法可能不太行。不过看起来你只是想重新采样;那么就这样做吧。如果你想的话,当然可以为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