Pandas 将日期字符串(仅月和年)转换为日期时间
Pandas Converting date string (only month and year) to datetime
我正在尝试将日期时间对象转换为日期时间。在原始数据框中,数据类型为字符串,数据集的形状为 (28000000, 26)。重要的是,日期格式仅为 MMYYYY。这是一个数据示例:
DATE
Out[3] 0 081972
1 051967
2 101964
3 041975
4 071976
我试过了:
df['DATE'].apply(pd.to_datetime(format='%m%Y'))
和
pd.to_datetime(df['DATE'],format='%m%Y')
我两次都遇到运行时错误
然后
df['DATE'].apply(pd.to_datetime)
它适用于其他未显示的列(使用 DDMMYYYY 格式),但使用 df['DATE'] 生成未来日期,因为它将日期读取为 MMDDYY 而不是 MMYYYY。
DATE
0 1972-08-19
1 2067-05-19
2 2064-10-19
3 1975-04-19
4 1976-07-19
预期输出:
DATE
0 1972-08
1 1967-05
2 1964-10
3 1975-04
4 1976-07
如果此问题重复,请将我指向原始问题,我找不到任何合适的答案。
提前感谢大家的帮助
首先如果报错明显是某些datetimes不匹配,可以通过errors='coerce'
参数和Series.isna
测试,因为不匹配的值返回缺失值:
print (df)
DATE
0 81972
1 51967
2 101964
3 41975
4 171976 <-changed data
print (pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce'))
0 1972-08-01
1 1967-05-01
2 1964-10-01
3 1975-04-01
4 NaT
Name: DATE, dtype: datetime64[ns]
print (df[pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce').isna()])
DATE
4 171976
通过 Series.dt.to_period
转换为日期时间和月期间的更改数据输出的解决方案:
df['DATE'] = pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce').dt.to_period('m')
print (df)
DATE
0 1972-08
1 1967-05
2 1964-10
3 1975-04
4 NaT
原始数据的解决方案:
df['DATE'] = pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce').dt.to_period('m')
print (df)
0 1972-08
1 1967-05
2 1964-10
3 1975-04
4 1976-07
我会做的:
df['date_formatted'] = pd.to_datetime(
dict(
year=df['DATE'].str[2:],
month=df['DATE'].str[:2],
day=1
)
)
也许这有帮助。适用于您的示例数据。
我正在尝试将日期时间对象转换为日期时间。在原始数据框中,数据类型为字符串,数据集的形状为 (28000000, 26)。重要的是,日期格式仅为 MMYYYY。这是一个数据示例:
DATE
Out[3] 0 081972
1 051967
2 101964
3 041975
4 071976
我试过了:
df['DATE'].apply(pd.to_datetime(format='%m%Y'))
和
pd.to_datetime(df['DATE'],format='%m%Y')
我两次都遇到运行时错误
然后
df['DATE'].apply(pd.to_datetime)
它适用于其他未显示的列(使用 DDMMYYYY 格式),但使用 df['DATE'] 生成未来日期,因为它将日期读取为 MMDDYY 而不是 MMYYYY。
DATE
0 1972-08-19
1 2067-05-19
2 2064-10-19
3 1975-04-19
4 1976-07-19
预期输出:
DATE
0 1972-08
1 1967-05
2 1964-10
3 1975-04
4 1976-07
如果此问题重复,请将我指向原始问题,我找不到任何合适的答案。
提前感谢大家的帮助
首先如果报错明显是某些datetimes不匹配,可以通过errors='coerce'
参数和Series.isna
测试,因为不匹配的值返回缺失值:
print (df)
DATE
0 81972
1 51967
2 101964
3 41975
4 171976 <-changed data
print (pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce'))
0 1972-08-01
1 1967-05-01
2 1964-10-01
3 1975-04-01
4 NaT
Name: DATE, dtype: datetime64[ns]
print (df[pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce').isna()])
DATE
4 171976
通过 Series.dt.to_period
转换为日期时间和月期间的更改数据输出的解决方案:
df['DATE'] = pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce').dt.to_period('m')
print (df)
DATE
0 1972-08
1 1967-05
2 1964-10
3 1975-04
4 NaT
原始数据的解决方案:
df['DATE'] = pd.to_datetime(df['DATE'],format='%m%Y', errors='coerce').dt.to_period('m')
print (df)
0 1972-08
1 1967-05
2 1964-10
3 1975-04
4 1976-07
我会做的:
df['date_formatted'] = pd.to_datetime(
dict(
year=df['DATE'].str[2:],
month=df['DATE'].str[:2],
day=1
)
)
也许这有帮助。适用于您的示例数据。