我有一个数据框架,df,有以下列:
df['ArrivalDate'] =
...
936 2012-12-31
938 2012-12-29
965 2012-12-31
966 2012-12-31
967 2012-12-31
968 2012-12-31
969 2012-12-31
970 2012-12-29
971 2012-12-31
972 2012-12-29
973 2012-12-29
...
列的元素是pandas. tslip . timestamp。
我想只包括年份和月份。我以为会有简单的方法,但我想不出来。
以下是我的尝试:
df['ArrivalDate'].resample('M', how = 'mean')
我得到了以下错误:
Only valid with DatetimeIndex or PeriodIndex
然后我试着:
df['ArrivalDate'].apply(lambda(x):x[:-2])
我得到了以下错误:
'Timestamp' object has no attribute '__getitem__'
有什么建议吗?
编辑:我有点明白了。
df.index = df['ArrivalDate']
然后,我可以使用索引重新采样另一列。
但是我仍然想要一个重新配置整个列的方法。什么好主意吗?
你可以直接访问year和month属性,或者请求datetime.datetime:
In [15]: t = pandas.tslib.Timestamp.now()
In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)
In [17]: t.to_pydatetime() #datetime method is deprecated
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)
In [18]: t.day
Out[18]: 5
In [19]: t.month
Out[19]: 8
In [20]: t.year
Out[20]: 2014
合并年和月的一种方法是对它们进行整数编码,例如:201408表示2014年8月。沿着整个列,你可以这样做:
df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)
或者它的许多变体。
不过,我不太喜欢这样做,因为它会使以后的日期对齐和算术变得很痛苦,尤其是对那些看到您的代码或数据时不遵循相同约定的人来说。更好的方法是选择一个月中的某一天,例如最后一个非美国假日工作日,或第一天等,并将数据保留为所选日期约定的日期/时间格式。
日历模块对于获取某些日子的数值非常有用,比如最后一个工作日。然后你可以这样做:
import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
lambda x: datetime.datetime(
x.year,
x.month,
max(calendar.monthcalendar(x.year, x.month)[-1][:5])
)
)
如果您碰巧正在寻找一种方法来解决将datetime列格式化为某种字符串化表示的更简单的问题,那么您可以使用datetime中的strftime函数。Datetime类,像这样:
In [5]: df
Out[5]:
date_time
0 2014-10-17 22:00:03
In [6]: df.date_time
Out[6]:
0 2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]
In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]:
0 2014-10-17
Name: date_time, dtype: object
你可以直接访问year和month属性,或者请求datetime.datetime:
In [15]: t = pandas.tslib.Timestamp.now()
In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)
In [17]: t.to_pydatetime() #datetime method is deprecated
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)
In [18]: t.day
Out[18]: 5
In [19]: t.month
Out[19]: 8
In [20]: t.year
Out[20]: 2014
合并年和月的一种方法是对它们进行整数编码,例如:201408表示2014年8月。沿着整个列,你可以这样做:
df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)
或者它的许多变体。
不过,我不太喜欢这样做,因为它会使以后的日期对齐和算术变得很痛苦,尤其是对那些看到您的代码或数据时不遵循相同约定的人来说。更好的方法是选择一个月中的某一天,例如最后一个非美国假日工作日,或第一天等,并将数据保留为所选日期约定的日期/时间格式。
日历模块对于获取某些日子的数值非常有用,比如最后一个工作日。然后你可以这样做:
import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
lambda x: datetime.datetime(
x.year,
x.month,
max(calendar.monthcalendar(x.year, x.month)[-1][:5])
)
)
如果您碰巧正在寻找一种方法来解决将datetime列格式化为某种字符串化表示的更简单的问题,那么您可以使用datetime中的strftime函数。Datetime类,像这样:
In [5]: df
Out[5]:
date_time
0 2014-10-17 22:00:03
In [6]: df.date_time
Out[6]:
0 2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]
In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]:
0 2014-10-17
Name: date_time, dtype: object
@KieranPC的解决方案是Pandas的正确方法,但不容易扩展到任意属性。为此,你可以在生成器理解中使用getattr,并使用pd.concat进行组合:
# input data
list_of_dates = ['2012-12-31', '2012-12-29', '2012-12-30']
df = pd.DataFrame({'ArrivalDate': pd.to_datetime(list_of_dates)})
# define list of attributes required
L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']
# define generator expression of series, one for each attribute
date_gen = (getattr(df['ArrivalDate'].dt, i).rename(i) for i in L)
# concatenate results and join to original dataframe
df = df.join(pd.concat(date_gen, axis=1))
print(df)
ArrivalDate year month day dayofweek dayofyear weekofyear quarter
0 2012-12-31 2012 12 31 0 366 1 4
1 2012-12-29 2012 12 29 5 364 52 4
2 2012-12-30 2012 12 30 6 365 52 4