我不断收到以下错误:
此行
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")
答案 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)