我有一系列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)
答案 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)
他们目前处理NaT
中PeriodIndex
的问题(即使是在掌握中),所以你的方法不会像那样工作。但似乎你只是想重新取样;这样做。如果需要,您当然可以为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