Pandas - 将datetime64转换为Period

2 投票
3 回答
2699 浏览
提问于 2025-04-18 07:27

我有一系列的日期,格式是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

撰写回答