如何在 pandas 中创建具有条件格式的日期列

How to create a date column with conditional format in pandas

我希望你能帮我解决这个问题,我认为这很容易,但我就是无法解决。我有一个数据框,其中日期时区列作为字符串和国家/地区列。美国的日期值采用“%y-%d-%m”格式,世界其他地区的日期值为“%y-%m-%d”。我想要做的是创建另一个具有相同日期格式的列。问题是我必须对美国使用一种格式,对世界其他地区使用另一种格式,我该如何解决这个问题?

data={"datetime":["2020-02-10 8:02:55 PM PST","2020-02-10 8:02:55 PM PST","2020-10-02 8:02:55 PM PST"],"country":["USA","USA","FRANCE"]}
df=pd.DataFrame(data)
df["date"]=pd.to_datetime(df["datetime"])
df["Month"]=pd.DatetimeIndex(df["date"]).month
df["Year"]=pd.DatetimeIndex(df["date"]).year
df

这是我得到的 DataFrame(我无法用 DT 格式粘贴它,顺便说一句,你是怎么做到的?)。事情是,对于法国,它使用 2 作为月份值。我尝试使用 python pd.series.dt.strftime 但我无法将其与国家/地区条件一起使用,因此我可以对美国使用一种格式,对其他国家/地区使用另一种格式。

                    datetime country                date  Month  Year
0  2020-02-10 8:02:55 PM PST     USA 2020-02-10 20:02:55      2  2020
1  2020-02-10 8:02:55 PM PST     USA 2020-02-10 20:02:55      2  2020
2  2020-10-02 8:02:55 PM PST  FRANCE 2020-10-02 20:02:55     10  2020

非常感谢!

您可以使用 dayfirst 关键字指定日期是否排在第一位。这里的挑战似乎是将 PST 正确解析为时区 US/Pacific。您可以使用映射字典来做到这一点 - 但是,pd.to_datetime 不支持它(但是,v1.1.3),因此您必须改用 dateutil

import pandas as pd
import dateutil 

df = pd.DataFrame({"datetime": ["2020-02-10 8:02:55 PM PST", "2020-02-10 8:02:55 PM PST", "2020-10-02 8:02:55 PM PST"],
                   "country": ["USA", "USA", "FRANCE"]})

# add column that specifies day first:
df['dayfirst'] = df['country'] == "FRANCE"

# create a mapping dict, mapping strings to time zones. add more if needed (e.g. PDT).
tzinfos = {'PST': dateutil.tz.gettz('US/Pacific')}

# create a function to parse the datetime strings
# this is not strictly needed but seems appropriate in terms of readability
def custom_parse_date(r):
    return dateutil.parser.parse(r['datetime'], dayfirst=r['dayfirst'], tzinfos=tzinfos)

df['parsed_dt'] = df.apply(lambda r: custom_parse_date(r), axis=1) 

# df['parsed_dt']
# 0   2020-02-10 20:02:55-08:00
# 1   2020-02-10 20:02:55-08:00
# 2   2020-02-10 20:02:55-08:00
# Name: parsed_dt, dtype: datetime64[ns, tzfile('US/Pacific')]