У вас есть список пар {date, value}, так что если вы Transpose , у вас будет список из двух списков - первый список дат, а второй список соответствующих значений,Затем вы можете взять Различия значений, Prepend 0, а затем снова транспонировать, чтобы вернуться к списку пар.
В коде,
data = {{{1971,1,31,0,0,0}, 1.0118},
{{1971,2,28,0,0,0}, 1.0075},
{{2010,5,31,0,0,0}, 1.0403}}
{dates, values} = Transpose[data];
diffs = Prepend[Differences[values], 0];
answer = Transpose[{dates, diffs}]
, который возвращает:
{{{1971,1,31,0,0,0}, 0},
{{1971,2,28,0,0,0}, -0.0043},
{{2010,5,31,0,0,0}, 0.0328}}
Чтобы обернуть это в одну функцию, благодаря Янусу за идею:
taildiffs[data_]:=
Transpose @ {#1, Prepend[Differences[#2], 0]}& @@ Transpose@data
Обратите внимание, что конструкция ... #1 ... #2 ... &
является чистой функцией:
http://reference.wolfram.com/mathematica/ref/Function.html
Синтаксис f@x
является просто сокращением для f[x]
.
Наконец, f@@list
является сокращением для Apply[f, list]
:
http://reference.wolfram.com/mathematica/ref/Apply.html
Так что taildiffs, как определено выше, является лишь краткой (возможно, загадочной) версией этого:
Apply[Transpose[Function[{x,y}, {x, Prepend[Differences[y],0]}], Transpose[data]]