Вводить переменные в область действия вызывающего?

У вас просто есть ошибки в вызове NumPy loadtxt, где вы определяете dtype. Это должно быть dtype=[('date', 'str', 26), ('wind', 'float')]; вы должны указать размер строки. Теперь вы можете ссылаться на поле даты, используя свое имя, EG: wind['date'] . Ваш формат strptime прекрасен, но вы хотите, чтобы модуль datetime из пакета datetime Python, а не time.

import numpy as np
from datetime import datetime
wind = loadtxt("/disk2/Wind/ws425.log.test", dtype=[('date', 'str', 26), ('wind', 'float')], delimiter=',', usecols=(0,4))
ts = [datetime.strptime(d, '%Y-%m-%d %H:%M:%S.%f') for d in wind['date']]

Это возвращает следующее:

[datetime.datetime(2013, 12, 11, 23, 0, 27, 3293),
 datetime.datetime(2013, 12, 11, 23, 0, 28, 295),
 datetime.datetime(2013, 12, 11, 23, 0, 29, 295),
 datetime.datetime(2013, 12, 11, 23, 0, 30, 3310)]

Возможно, вы хотите передать это обратно в ваш массив NumPy?

wind['date'] = np.array(ts, dtype='datetime64[s]')

это дает

array([('2013-12-11T23:00:27Z', 5.8), ('2013-12-11T23:00:28Z', 5.5),
   ('2013-12-11T23:00:29Z', 4.0), ('2013-12-11T23:00:30Z', 4.9)],
  dtype=[('date', 'S26'), ('wind', '<f8')])
15
задан jogloran 25 March 2010 в 12:37
поделиться

1 ответ

По правилам Python вы не можете изменить локальные локальные жители вызывающего абонента; в текущих реализациях, если вы попытаетесь (например, с помощью черной магии, которую предлагает Anurag), вы не получите исключения (хотя я бы хотел добавить эту проверку ошибок в какую-то будущую версию), но она будет по существу неработоспособной, если ваш вызывающий абонент функция (не если ваш вызывающий является кодом верхнего уровня модуля) - фактические локальные переменные вызывающего на самом деле не будут затронуты. Это относится к тому, передаются ли локальные переменные вызывающего абонента явным образом или извлекаются с помощью черной магии: они по-прежнему должны рассматриваться как доступный только для чтения, если ваш код должен иметь здравый смысл.

Скорее, вы можете передать вызывающей стороне явный, реальный, нормальный dict (который может быть инициализирован из locals () , если хотите), и все изменения, которые ваш код делает в этом dict, по-прежнему будут быть там для использования вызывающим - только не как "новые простые имена" в локальной области действия вызывающего, конечно, но функциональность такая же, независимо от того, нужно ли вызывающему использовать x ['foo'] или ] x.foo или (как вам удобнее) просто barename foo .

Кстати, чтобы использовать синтаксис доступа к атрибутам, а не синтаксис индексирования dict, вы можете:

class Bunch(object): pass

...

# caller code
b = Bunch()
thefun(b)
print b.foo

...

# called function
def thefun(b):
  b.foo = 23

Это также охватывает, с небольшими вариациями, случай, когда thefun хочет работать с индексированием dict синтаксис (скажем, его тело b ['foo'] = 23 вместо b.foo = 23 ): в этом случае вызывающему абоненту достаточно использовать thefun ( vars (b)) вместо простого thefun (b) , но впоследствии он может продолжать работать с синтаксисом доступа b.foo .

8
ответ дан 1 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: