我想(手动)按照下面的代码在Python中创建一个具有每日日期(在列'date'中)的数据框架。但是代码没有为每日日期提供正确的格式,忽略了日期(所需的格式表示如下)。你能告诉我如何纠正代码,使"日期"列以所需的格式输入吗?提前感谢!
------------------------------------------------------
desired format for date column
2021-03-22 3
2021-04-07 3
2021-04-18 3
2021-05-12 0
------------------------------------------------------
df1 = pd.DataFrame({"date": [2021-3-22, 2021-4-7, 2021-4-18, 2021-5-12],
"x": [3, 3, 3, 0 ]})
df1
date x
0 1996 3
1 2010 3
2 1999 3
3 2004 0
Python希望将序列2021-3-22
中的数字解释为一系列数学运算2021 minus 3 minus 22
。
如果你想要这个项目被存储为一个类似于日期的字符串,你需要将它们标记为字符串文字数据类型(str
),如下所示,用引号封装它们。
import pandas as pd
df1 = pd.DataFrame({"date": ['2021-3-22', '2021-4-7', '2021-4-18', '2021-5-12'],
"x": [3, 3, 3, 0 ]})
日期列的结果,如这里所示,表明日期列包含object
数据类型的元素,其中包含pandas中的str
。请注意,字符串的创建完全如下所示(2021-3-22
而不是2021-03-22
)。
0 2021-3-22
1 2021-4-7
2 2021-4-18
3 2021-5-12
Name: date, dtype: object
然而,如果你实际上希望它们存储为datetime
对象,以便你可以对它们进行日期时间操作(即确定两个日期之间的天数或按特定的月份或年份过滤),那么你需要将值转换为datetime
对象。
df1['date'] = pd.to_datetime(df1['date'])
此转换的结果是Pandasdatetime
对象,它支持纳秒级精度(我将其与仅限于微秒级精度的Pythondatetime
对象区分)。
0 2021-03-22
1 2021-04-07
2 2021-04-18
3 2021-05-12
Name: date, dtype: datetime64[ns]
请注意,现在显示的结果的格式就像您期望的datetimes
一样(2021-03-22
而不是2021-3-22
)。
您将希望将系列创建为日期时间,并在将其创建为字符串时使用以下代码,更多信息请参阅此处pandas.to_datetime:
df1 = pd.DataFrame({"date": pd.to_datetime(["2021-3-22", "2021-4-7", "2021-4-18", "2021-5-12"]),
"x": [3, 3, 3, 0 ]})
我经常使用pd.read_csv(io.StringIO(text))
将表格式数据复制/粘贴到DataFrame
中(例如,来自SO问题)。
的例子:
import io
import re
import pandas as pd
def df_read(txt, **kwargs):
txt = 'n'.join([s.strip() for s in txt.splitlines()])
return pd.read_csv(io.StringIO(re.sub(r' +', 't', txt)), sep='t', **kwargs)
txt = """
date value
2021-03-22 3
2021-04-07 3
2021-04-18 3
2021-05-12 0
"""
df = df_read(txt, parse_dates=['date'])
>>> df
date value
0 2021-03-22 3
1 2021-04-07 3
2 2021-04-18 3
3 2021-05-12 0
>>> df.dtypes
date datetime64[ns]
value int64
dtype: object