使用series.apply的意外的Pandas / Arrow行为

时间:2018-01-08 12:42:01

标签: python pandas datetime

我正在使用pandasarrow日期时间扩展程序包来操作某些日期。我的代码如下:

srs = pd.Series(['2016-10-02T00:24:15.707Z','2016-10-02T00:24:27.294Z','2016-10-02T01:15:56.682Z'])
dt = srs.apply(arrow.get,tz="Europe/Paris")
ym = dt.apply(arrow.arrow.Arrow.format,'MMM-YY')
print(ym)

打印:

0    2016-10-02 00:24:15+00:00
1    2016-10-02 00:24:27+00:00
2    2016-10-02 01:15:56+00:00
dtype: object

yearmonths=[]

for ind,row in dt.iteritems():
    yearmonth = row.format('MMM-YY')
    yearmonths.append(yearmonth)
print(yearmonths)

打印:

['Oct-16', 'Oct-16', 'Oct-16']

我不明白为什么最上面的代码块不会产生与下块相同的输出,因为在我看来它应该是。我错过了什么或这是一个错误吗?

3 个答案:

答案 0 :(得分:4)

您可以使用内部Pandas方法实现相同的目标:

In [54]: pd.to_datetime(srs).dt.tz_localize('Europe/Paris').dt.strftime('%b-%y')
Out[54]:
0    Oct-16
1    Oct-16
2    Oct-16

答案 1 :(得分:2)

apply函数将序列中的值作为参数应用到format函数中。因此,它不会返回你想要的东西。基本上,考虑应用为执行以下操作(伪代码):

for value in the_series:
    format(value, 'MMM-YY')

format的签名是format(your_date_format)

如果您想使用apply并获得与底部相同的结果,则必须创建自定义函数:

def format_date(date):
    return date.format('MMM-YY')

ym = dt.apply(format_date)

结果:

0    Oct-16
1    Oct-16
2    Oct-16

答案 2 :(得分:1)

如果你跑

怎么办?

ym = dt.apply(lambda x: x.format('MMM-YY'))

代替?这更类似于您在iteritems示例中所做的事情。