Как выбрать столбцы данных, используя строковые ключи, когда имена столбцов являются временными метками? - PullRequest
0 голосов
/ 11 мая 2018

В пандах временной ряд может быть проиндексирован путем передачи строки, которая интерпретируется как дата.Это работает и для DataFrame:

>>> dates = pd.date_range('2000-01-01', periods=8, freq='M')
>>> df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
>>> df
                   A         B         C         D
2000-01-31  0.096115  0.069723 -1.546733 -1.661178
2000-02-29  0.256296  1.838310  0.227132  1.765269
2000-03-31  0.315862  0.167007 -1.340888  1.005260
2000-04-30  1.238728 -2.325420  1.371134 -0.373232
2000-05-31  0.639211 -0.209961 -1.006498  0.005214
2000-06-30  0.091590 -0.664554 -2.037539 -1.335070
2000-07-31  0.275373 -0.398758  0.402848  0.441035
2000-08-31  2.189259 -1.236159 -0.579680  0.878355
>>> df['2000-05']
                   A         B         C         D
2000-05-31  0.639211 -0.209961 -1.006498  0.005214

Я ищу способы сделать это, когда метками времени являются имена столбцов.

>>> df = df.T
>>> df['2000-05']

Это дает TypeError: only integer scalar arrays can be converted to a scalar index.То же самое верно для

>>> df.loc[:, '2000-05']

Самое непосредственное решение, о котором я могу подумать, это

>>> df.T['2000-05'].T
   2000-05-31
A    0.639211
B   -0.209961
C   -1.006498
D    0.005214

, но мне интересно, есть ли другие хорошие решения.Я полагаю, что для очень больших DataFrames выполнение транспонирования может оказать влияние на производительность, которого можно здесь избежать.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Может быть, вы можете попробовать str, contains

df[df.index.str.contains('2000-05')].T
Out[163]: 
   2000-05-31
A    0.639211
B   -0.209961
C   -1.006498
D    0.005214
0 голосов
/ 11 мая 2018

Существует также truncate, который позволяет работать с объектами даты и времени вместо обработки имен столбцов как строк.

Для этого потребуются две даты, хотя аргументы before и after действуют как выходные для периода, который вы хотите сохранить.

df_t = df.T
df_t.columns = pd.to_datetime(df_t.columns)

df_t.truncate(after="2000-03", before="2000-02", axis=1)

   2000-02-29
A    0.256296
B    1.838310
C    0.227132
D    1.765269
0 голосов
/ 11 мая 2018

Ну, там - это , всегда опция filter.

df = df.T
df.filter(like='2000-05')

   2000-05-31
A    1.884517
B    0.258133
C    0.809360
D   -0.069186

filter дает вам большую гибкость, например, с помощью регулярных выражений:

df.filter(regex='2000-.*-30')

   2000-04-30  2000-06-30
A   -2.968870    2.064582
B   -0.844370    0.093393
C    0.027328    0.033193
D   -0.270860   -0.455323
...