Вычитание временной метки должно иметь одинаковые часовые пояса - PullRequest
0 голосов
/ 27 марта 2020

Я получаю следующую ошибку:

  • TypeError: Вычитание метки времени должно иметь одинаковые или отсутствующие часовые пояса

В этой строке

df['days_in_Month'].loc[df['Month'] == min_date_Month] = (df['Month_end'] - \
                                                          pd.to_datetime(min_date,format="%Y-%m-%d"))

My df ['TransactionDate'] - это столбец со следующим форматом 2019-08-23T00: 00: 00.000Z. Я программирую на Python3 .3.7.

df['Month'] = df['TransactionDate'].apply(lambda x : str(x)[:7])
df['Month_begin'] = pd.to_datetime(df['Month'], format="%Y-%m") + MonthBegin(0)
df['Month_end'] = pd.to_datetime(df['Month'], format="%Y-%m") + MonthEnd(1)

df['days_in_Month'] = (df['Month_end'] - df['Month_begin'])#.days()
print(df.columns)
print(df)

min_date = df['TransactionDate'].min()
min_date_Month = min_date[:7]

df['days_in_Month'].loc[df['Month'] == min_date_Month] = (df['Month_end'] - \
                                                          pd.to_datetime(min_date,format="%Y-%m-%d"))
df['Month_begin'].loc[df['Month'] == min_date_Month] = pd.to_datetime(min_date,format="%Y-%m-%d")

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Когда вы выполняете часть своей оскорбительной инструкции:

pd.to_datetime(min_date, format="%Y-%m-%d")

, вы получите:

Timestamp('2019-11-01 00:00:00+0000', tz='UTC')

Это означает, что format = "% Y-% m- % d " не препятствует синтаксическому анализу этой функцией входной строки целом , поэтому в результате получается с часовым поясом.

Для анализа только часть даты, запустите:

pd.to_datetime(min_date[:10])

(даже без формат ) и вы получите:

Timestamp('2019-11-01 00:00:00')

без часовой пояс.

Но вся ваша инструкция странная. Когда вы запускаете с левой стороны в одиночку:

df['days_in_Month'].loc[df['Month'] == min_date_Month]

вы получите:

0   29 days
Name: days_in_Month, dtype: timedelta64[ns]

Но при запуске с правой стороны Только:

df['Month_end'] - pd.to_datetime(min_date[:10])

Вы получите:

0    29 days
1    60 days
2    91 days
3   120 days
Name: Month_end, dtype: timedelta64[ns]

Таким образом, вы пытаетесь сохранить весь столбец в отдельной ячейке .

Может быть, эта инструкция должна быть:

df['days_in_Month'] =  df['Month_end'] - pd.to_datetime(min_date[:10])

вместо?

И еще одно замечание: Ваш столбец days_in_Month на самом деле имеет значение timedelta64 введите, а не количество дней.

Чтобы указать количество дней в каждом месяце (как целое число ), необходимо выполнить:

df['days_in_Month'] = (df['Month_end'] - df['Month_begin']).dt.days + 1

Обратите внимание, что, например, разница между 2019-11-01 и 2019-11-30 составляет 29 дней, тогда как в ноябре 30 дней.

0 голосов
/ 27 марта 2020

проблема в том, что Z в вашей строке datetime приводит к тому, что дата и время интерпретируются как ut c timezone

, но ваш ключ Month_end не имеет никакой информации о часовом поясе, поэтому он не имеет часового пояса связанный с ним

pandas не знает, как взаимодействовать с этими двумя разными вещами, поэтому вам нужно либо удалить часовой пояс из строки даты-времени, либо лучше сделать так, чтобы ваш другой часовой пояс даты-времени знал ut c ,

pandas делает это относительно простым

Month_end = pandas.to_datetime(month_end_strings,utc=True)
...