使用 pd.to_datetime() 更新列时出现问题

Issues updating a column with pd.to_datetime()

提问人:Kel 提问时间:11/14/2023 最后编辑:FObersteinerKel 更新时间:11/14/2023 访问量:36

问:

我在更新数据帧中的列时遇到了一些问题。 我收到的数据是数据/时间,所以我想根据pd.to_datetime格式化它。但是对 DST 的更改开始产生一些问题。

我的数据如下所示:

0     2023-10-08T19:44:29.862-04:00
1     2023-10-09T01:06:42.762-04:00
2     2023-10-12T18:35:09.060-04:00
3     2023-10-12T18:55:02.459-04:00
4     2023-10-17T23:56:28.330-04:00
5     2023-10-18T02:51:33.481-04:00
6     2023-10-24T15:59:30.074-04:00
7     2023-10-24T18:00:55.081-04:00
8     2023-11-03T15:59:30.021-04:00
9     2023-11-06T15:59:30.824-05:00
10    2023-11-07T15:59:32.386-05:00
11    2023-11-09T15:59:30.032-05:00
12    2023-11-10T15:59:57.509-05:00
14    2023-11-13T15:59:31.065-05:00
Name: Time, dtype: object

我想将它作为 dtype:datetime,这样我就可以轻松操作它(更改时区)。

我想做的操作如下:

df.Time = pd.to_datetime(df.Time, errors='coerce',utc=True)
df.Time = df.Time.dt.tz_convert("Australia/Sydney")
df.Time = pd.to_datetime(df.Time) - pd.Timedelta(8, "H")

我从中得到的错误警告是: SettingWithCopyWarning: 尝试在 DataFrame 中的切片副本上设置值。 尝试改用 .loc[row_indexer,col_indexer] = value

但是如果更改 df.df.loc[:, “时间”] 的时间 代码不计算,并且第二行出现以下错误: AttributeError:只能使用具有 datetimelike 值的 .dt 访问器

我也试图改变df。是时候 df 了。[“Time”] 或在句子末尾添加 .copy(),但仍然有相同的错误。

我错过了什么吗? 原始代码完全符合我的要求,但向我发出警告,并且在尝试解决警告时,它会创建错误。

python pandas 日期时间 python-datetime pandas-settingwithcopy-warning

评论

0赞 FObersteiner 11/14/2023
请看下面的例子。你能毫无错误地运行它吗?

答:

0赞 FObersteiner 11/14/2023 #1

与 pandas v2 完美配合;下面的最小可重复示例。请注意,可以通过删除对 pd.to_datetime 的第二个调用来略微简化。

import pandas as pd

df = pd.DataFrame(
    {
        "Time": [
            "2023-10-24T18:00:55.081-04:00",
            "2023-11-03T15:59:30.021-04:00",
            "2023-11-06T15:59:30.824-05:00",
            "2023-11-07T15:59:32.386-05:00",
            "2023-11-09T15:59:30.032-05:00",
        ],
    }
)

df["Time"] = pd.to_datetime(df["Time"], errors="coerce", utc=True)
df["Time"] = df.Time.dt.tz_convert("Australia/Sydney")
df["Time"] -= pd.Timedelta(8, "H")
df["Time"]
0   2023-10-25 01:00:55.081000+11:00
1   2023-11-03 22:59:30.021000+11:00
2   2023-11-06 23:59:30.824000+11:00
3   2023-11-07 23:59:32.386000+11:00
4   2023-11-09 23:59:30.032000+11:00
Name: Time, dtype: datetime64[ns, Australia/Sydney]

pd.__version__
'2.1.2'