时间戳减法必须具有相同的时区

时间:2020-03-27 04:48:24

标签: python pandas dataframe datetime timestamp

我不断收到以下错误:

  • TypeError:时间戳减法必须具有相同的时区,或者没有 时区

此行

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

我的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 :(得分:1)

当您执行一条令人反感的说明时:

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

您将得到:

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

它表示 format =“%Y-%m-%d” 不会阻止此功能 通过解析整个输入字符串,因此结果是 with 时区。

要仅解析 日期部分,请运行:

pd.to_datetime(min_date[:10])

(即使没有 format ),您也会得到:

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 天,而11月是 30 天。

答案 1 :(得分:0)

问题是日期时间字符串中的Z导致日期时间被解释为utc时区

但是您的Month_end密钥没有附加任何时区信息,因此它没有与之关联的时区

pandas不知道如何与这两种不同的事物进行交互,因此您需要从datetime字符串中删除时区,或者更好地使其他datetimes时区对utc敏感。

熊猫使这相对容易

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