如何以正确的格式手动输入包含每日日期的 Python 数据框

how to enter manually a Python dataframe with daily dates in a correct format

我想(手动)在 Python 中创建一个包含每日日期的数据框(在 'date' 列中),按照以下代码。 但是代码没有为每日日期提供正确的格式,忽略了日期(所需的格式表示如下)。 您能告诉我如何更正代码,以便以所需格式输入 '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'])

此转换的结果是 Pandas datetime 对象,可实现纳秒精度(我将其与限于微秒精度的 Python datetime 对象区分开来)。

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 ]})

FWIW,我经常使用pd.read_csv(io.StringIO(text))将copy/pastetabular-looking数据转化为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